質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1148閲覧

シンボルが見つからない

linkinpark

総合スコア42

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/08/07 12:42

編集2020/08/07 14:07

自分で関数を作ったのですがシンボルが見つからないと言われてコンパイルできません。
自分でエラーのメッセージから原因を探ったのですがわかりません。
もしよろしければ教えていただけると幸いです。

Java

1コード 2Similarity 3 4package Class; 5import Class.*; 6 7import java.io.*; 8import java.lang.*; 9import java.util.*; 10import java.lang.Math; 11 12public class Similarity { 13 14//------------------------------------------------------------------ 15// 関数名 Jaccard 16// 概要 テストユーザと訓練ユーザ間のJaccard係数を算出 17// 引数 x[i] :テストユーザの映画iに対する評価値 18// y[i] :訓練ユーザの映画iに対する評価値 19// 戻り値 なし 20//------------------------------------------------------------------ 21 static double Jaccard(int[] x, int[] y){ 22 double wa=0; //テストユーザが高評価を与えているアイテムの集合と訓練ユーザが高評価を与えているアイテムの集合の和集合による要素数を示す変数 23 double seki=0; //テストユーザが高評価を与えているアイテムの集合と訓練ユーザが高評価を与えているアイテムの集合の積集合による要素数を示す変数 24 25 // 全アイテムについて1つずつチェック 26 for(int i=0; i<x.length; i++){ 27 // テストユーザと訓練ユーザがともに高評価を与えているとき、変数sekiをインクリメント 28 if(x[i] >= 4 && y[i] >= 4){ 29 seki += 1; 30 } 31 // テストユーザと訓練ユーザのどちらかが高評価を与えているとき、変数waをインクリメント 32 if(x[i] >= 4 || y[i] >= 4){ 33 wa += 1; 34 } 35 } 36 // Jaccard係数の計算を返す 37 return seki / wa; 38 } 39 40 static double Euclid(int[] x, int[] y){ 41 double d=0; 42 double w=0; 43 for(int i=0;i<x.length;i++){ 44 d=d+Math.pow((x[i]-y[i]),2); 45 } 46 w=Math.sqrt(d); 47 return 1/(w+1); 48 } 49 50} 51 52 53Main 54 package Class; 55import Class.*; 56 57import java.io.*; 58import java.lang.*; 59import java.util.ArrayList; 60import java.util.List; 61import java.util.Arrays; 62import java.util.Comparator; 63import java.text.DecimalFormat; 64 65public class Main { 66 public static final int TESTUSER = 300; //テストユーザの数 67 public static final int OTHERUSER = 600; //訓練ユーザの数 68 public static final int ITEM = 1682; //アイテム総数 69 public static final int QUERYITEM = 10; //クエリアイテムの数 70 public static final int NEIGHBOR = 100; //近傍ユーザ数 71 public static final int RANK = 20; //推薦アイテムの数 72 public static final int VALIDATION= 3; //検定回数 73 74 public static void main(String[] args){ 75 //フォーマットを定義 76 DecimalFormat df = new DecimalFormat("0.000"); 77 78 //交差検定による推薦精度の評価指標 79 double[] AvePrec= new double[VALIDATION]; //検定iの全てのテストユーザの平均適合率 80 double[] AveReca= new double[VALIDATION]; //検定iの全てのテストユーザの平均再現率 81 82 //各テストユーザに対する推薦精度を出力するファイル名 83 String output = "Result/result"+NEIGHBOR+"_"+RANK+".txt"; 84 85 for(int val=1; val<(VALIDATION+1); val++){ //val回目の検定を行う 86 //ファイルの定義 87 String input1 = "Dataset/test_"+val+".txt"; //テストユーザのデータファイルを指定 88 String input2 = "Dataset/training_"+val+".txt"; //訓練ユーザのデータファイルを指定 89 String input3 = "Dataset/query_"+val+".txt"; //クエリアイテムのデータファイルを指定 90 91 //テストユーザ・訓練ユーザのクエリアイテムに対する評価値 92 int[][] T_query = new int[TESTUSER+1][QUERYITEM+1]; 93 int[][] O_query = new int[OTHERUSER+1][QUERYITEM+1]; 94 95 //テストユーザ・訓練ユーザ・クエリアイテム・推薦アイテム 96 int[][] TestUser = new int[TESTUSER+1][ITEM+1]; 97 int[][] OtherUser = new int[OTHERUSER+1][ITEM+1]; 98 int[][] TestQuery = new int[TESTUSER+1][QUERYITEM+1]; 99 100 //テストユーザ・訓練ユーザ間の類似度 101 double[][] sim = new double[TESTUSER+1][OTHERUSER+1]; 102 103 //テストユーザに対する近傍ユーザの数・推薦アイテムの数 104 int[] NeiUser = new int[TESTUSER+1]; 105 int[] Rank = new int[TESTUSER+1]; 106 107 //推薦精度の評価指標 108 double[] prec = new double[TESTUSER+1]; //各テストユーザの適合率 109 double[] reca = new double[TESTUSER+1]; //各テストユーザの再現率 110 double[] tmp = new double[TESTUSER]; //適合率,再現率の平均値算出用の仮配列 111 112 //訓練ユーザのリスト(id,value,sim)・推薦アイテムのスコアのリスト(id,score) 113 UserList[][] OtherList = new UserList[TESTUSER+1][OTHERUSER+1]; 114 ItemList[][] RecItem = new ItemList[TESTUSER+1][ITEM+1]; 115 116 //テストユーザ・訓練ユーザ・クエリアイテムの読み込み・格納 117 FileIO.DataInput(TestUser,input1); 118 FileIO.DataInput(OtherUser,input2); 119 FileIO.DataInput(TestQuery,input3); 120 121 //クエリアイテムに対する評価値からテストユーザiと訓練ユーザj間の類似度を算出 122 for(int i=1; i<TestUser.length; i++){ 123 for(int j=1; j<OtherUser.length; j++){ 124 for(int k=1; k<TestQuery[i].length; k++){ 125 T_query[i][k] = TestUser[i][TestQuery[i][k]]; 126 O_query[j][k] = OtherUser[j][TestQuery[i][k]]; 127 } 128 129 //Jaccard係数による類似度計算 130 //sim[i][j] = Similarity.Jaccard(T_query[i],O_query[j]); 131 sim[i][j] = Similarity.Euclid(T_query[i],O_query[j]); 132 133 134 } 135 } 136 137 138 //訓練ユーザのリスト作成・近傍ユーザの形成 139 for(int i=1; i<TestUser.length; i++){ 140 NeiUser[i]=Recommend.Neighbor(OtherUser, sim[i], OtherList[i], NEIGHBOR); 141 //System.out.println("[テストユーザ"+i+"の近傍ユーザ"+NEIGHBER+"("+NeiUser[i]+")人]"); 142 //for(int j=0; j<NeiUser[i]; j++) 143 // OtherList[i][j].printList(); 144 } 145 146 //テストユーザに対する推薦アイテムのスコア値を算出 147 for(int i=1; i<TestUser.length; i++){ 148 Recommend.Predict(T_query[i], OtherUser, NeiUser[i], OtherList[i], RecItem[i]); 149 //System.out.println("[テストユーザ"+i+"の推薦アイテムのスコア"); 150 //for(int j=0; j<(ITEM+1); j++) 151 // RecItem[i][j].printList(); 152 } 153 154 155 156 //推薦アイテムの上位N件を選出 157 for(int i=1; i<TestUser.length; i++){ 158 Rank[i]=Recommend.Ranking(TestQuery[i], RANK, RecItem[i]); 159 //System.out.println("[テストユーザ"+i+"の推薦アイテム"+RANK+"("+Rank[i]+")件]"); 160 //for(int j=0; j<Rank[i]; j++) 161 // RecItem[i][j].printList(); 162 } 163 164 //推薦精度を算出 165 for(int i=1; i<TestUser.length; i++){ 166 prec[i]= Score.Precision(TestUser[i], RecItem[i], Rank[i]); 167 reca[i]= Score.Recall(TestUser[i], RecItem[i], T_query[i], Rank[i]); 168 //System.out.print("TestUser:"+i+"\tPrecision:"+df.format(prec[i])); 169 //System.out.println("\tRecall:"+df.format(reca[i])); 170 } 171 172 System.arraycopy(prec,1,tmp,0,tmp.length); //適合率の配列を仮配列にコピー 173 AvePrec[val-1] = Statistic.Average(prec); 174 System.arraycopy(reca,1,tmp,0,tmp.length); //再現率の配列を仮配列にコピー 175 AveReca[val-1] = Statistic.Average(reca); 176 //System.out.print("["+val+"]Averaged_Precision:"+(AvePrec[val-1])); 177 //System.out.println("\tAveraged_Recall:"+(AveReca[val-1])); 178 FileIO.DataOutput(TestUser,prec,reca,val,output); 179 } 180 181 FileIO.DataOutput(Statistic.Average(AvePrec),Statistic.Average(AveReca),output); 182 System.out.print("All_Precision:"+df.format(Statistic.Average(AvePrec))); 183 System.out.println("\tAll_Recall:"+df.format(Statistic.Average(AveReca))); 184 185 } 186} 187Main.java:78: エラー: シンボルを見つけられません 188 sim[i][j] = Similarity.Euclid(T_query[i],O_query[j]); 189 ^ 190 シンボル: メソッド Euclid(int[],int[]) 191 場所: クラス Similarity 192エラー1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2020/08/07 12:57

T_query と、O_query の宣言をしているコードが見当たりません。 宣言をしていない変数を使おうとするのは、無理だと思いませんか?
linkinpark

2020/08/07 13:02

T_query[i][k] = TestUser[i][TestQuery[i][k]]; O_query[j][k] = OtherUser[j][TestQuery[i][k]]; この部分は不要だと思いつけませんでした。なぜならJaccardは動いたからです
cateye

2020/08/07 13:27

コンパイルできるコードを上げて下さい。
momon-ga

2020/08/07 13:27

Mainの書いてあるクラスと、Similarityは別のクラスですか? Jaccardの動作確認をしたあとに、Euclidを追加しましたか? Euclidを追加したあとに、Similarityをリコンパイルしましたか?
momon-ga

2020/08/07 13:30 編集

念のためですが・・・ これ記載を省略して中かっこの数があってないだけですよね? Jaccardは、returnがないし、掲載コードがめちゃくちゃなので、エラーの出るメソッドを省略せずに、そのまま載せてください。
linkinpark

2020/08/07 13:37

申し訳ないです承知しました
linkinpark

2020/08/07 14:01

変更加えましたのでもしよろしければ教えていただけると幸いです。
swordone

2020/08/07 14:07

コードはMarkdownしてください。
linkinpark

2020/08/07 14:08

エラーを追加しました
swordone

2020/08/07 15:49

Markdownの閉じ```がありません。
ironya

2020/08/07 17:20 編集

上のコード、提示されたクラス以外でコンパイルエラーになるところをコメントアウトすると、特に(次のような)コンパイルエラーになりませんけど。 Main.java:78: エラー: シンボルを見つけられません sim[i][j] = Similarity.Euclid(T_query[i],O_query[j]); ^ シンボル: メソッド Euclid(int[],int[]) 場所: クラス Similarity エラー1個
momon-ga

2020/08/08 00:05

↑なるほど、ということは Euclidを追加したあとに、Similarityをリコンパイルしていない可能性高いですね。
guest

回答3

0

ベストアンサー

回答、質問とは直接関係ないですが、markdownがきちんと適用されているか確認するクセをつけた方がよいです。

で、コメントにもありますが、以下のようにしましたがコンパイルエラーは再現しませんでした。

java

1 public static final int TESTUSER = 300; //テストユーザの数 2 public static final int OTHERUSER = 600; //訓練ユーザの数 3 public static final int QUERYITEM = 10; //クエリアイテムの数 4 5 public static void main(String[] args) { 6 //テストユーザ・訓練ユーザのクエリアイテムに対する評価値 7 int[][] T_query = new int[TESTUSER+1][QUERYITEM+1]; 8 int[][] O_query = new int[OTHERUSER+1][QUERYITEM+1]; 9 10 //テストユーザ・訓練ユーザ間の類似度 11 double[][] sim = new double[TESTUSER+1][OTHERUSER+1]; 12 13 int i = 0, j = 0; 14 sim[i][j] = Similarity.Euclid(T_query[i],O_query[j]); 15 16 }

Similarity.classが最新化されていないのだと推測します。
Similarityを再コンパイルしてみては、どうでしょうか。

投稿2020/08/08 00:24

momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Main

//sim[i][j] = Similarity.Jaccard(T_query[i],O_query[j]);この関数は実行できました。
sim[i][j] = Similarity.Euclid(T_query[i],O_query[j]);

この記述が意味不明
JAVAの文法になってない

投稿2020/08/07 13:01

y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

linkinpark

2020/08/07 13:04

どの部分がJavaの文法になっていませんか?
linkinpark

2020/08/07 13:04

色々と省略しているのは申し訳ないです
y_waiwai

2020/08/07 13:14

もちっと基本的な文法を勉強しよう
momon-ga

2020/08/07 13:25

わかりずらい指摘だけど、Mainの部分の書き方を省略してるので、意味不明ってことだと思いますよ。
linkinpark

2020/08/07 14:01

変更しましたのでもしよろしければ教えていただけると幸いです。
linkinpark

2020/08/07 14:08

エラーを追加しました
guest

0

Main.java:78: エラー: シンボルを見つけられません

sim[i][j] = Similarity.Euclid(T_query[i],O_query[j]);
^
シンボル: メソッド Euclid(int[],int[])
場所: クラス Similarity
エラー1個

記載のとおり、Similarityというクラスでint配列を2つ引数に取るEuclidメソッドが存在しません。

投稿2020/08/07 12:46

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

linkinpark

2020/08/07 12:51

SimilarityというクラスにEuclidメソッド書いているのですがなぜなのでしょうか?
linkinpark

2020/08/07 14:02

変更しましたのでもしよろしければ教えていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問