自分で関数を作ったのですがシンボルが見つからないと言われてコンパイルできません。
自分でエラーのメッセージから原因を探ったのですがわかりません。
もしよろしければ教えていただけると幸いです。
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個
T_query と、O_query の宣言をしているコードが見当たりません。
宣言をしていない変数を使おうとするのは、無理だと思いませんか?
T_query[i][k] = TestUser[i][TestQuery[i][k]];
O_query[j][k] = OtherUser[j][TestQuery[i][k]];
この部分は不要だと思いつけませんでした。なぜならJaccardは動いたからです
コンパイルできるコードを上げて下さい。
Mainの書いてあるクラスと、Similarityは別のクラスですか?
Jaccardの動作確認をしたあとに、Euclidを追加しましたか?
Euclidを追加したあとに、Similarityをリコンパイルしましたか?
念のためですが・・・
これ記載を省略して中かっこの数があってないだけですよね?
Jaccardは、returnがないし、掲載コードがめちゃくちゃなので、エラーの出るメソッドを省略せずに、そのまま載せてください。
申し訳ないです承知しました
変更加えましたのでもしよろしければ教えていただけると幸いです。
コードはMarkdownしてください。
エラーを追加しました
Markdownの閉じ```がありません。
上のコード、提示されたクラス以外でコンパイルエラーになるところをコメントアウトすると、特に(次のような)コンパイルエラーになりませんけど。
Main.java:78: エラー: シンボルを見つけられません
sim[i][j] = Similarity.Euclid(T_query[i],O_query[j]);
^
シンボル: メソッド Euclid(int[],int[])
場所: クラス Similarity
エラー1個
↑なるほど、ということは
Euclidを追加したあとに、Similarityをリコンパイルしていない可能性高いですね。
回答3件
あなたの回答
tips
プレビュー