質問編集履歴

2

エラーを追加

2020/08/07 14:07

投稿

linkinpark
linkinpark

スコア42

test CHANGED
File without changes
test CHANGED
@@ -377,3 +377,15 @@
377
377
  }
378
378
 
379
379
  }
380
+
381
+ Main.java:78: エラー: シンボルを見つけられません
382
+
383
+ sim[i][j] = Similarity.Euclid(T_query[i],O_query[j]);
384
+
385
+ ^
386
+
387
+ シンボル: メソッド Euclid(int[],int[])
388
+
389
+ 場所: クラス Similarity
390
+
391
+ エラー1個

1

問題のあるコードをすべて載せました

2020/08/07 14:07

投稿

linkinpark
linkinpark

スコア42

test CHANGED
File without changes
test CHANGED
@@ -8,7 +8,45 @@
8
8
 
9
9
  コード
10
10
 
11
+ Similarity
12
+
13
+
14
+
15
+ package Class;
16
+
17
+ import Class.*;
18
+
19
+
20
+
21
+ import java.io.*;
22
+
23
+ import java.lang.*;
24
+
25
+ import java.util.*;
26
+
27
+ import java.lang.Math;
28
+
29
+
30
+
31
+ public class Similarity {
32
+
33
+
34
+
35
+ //------------------------------------------------------------------
36
+
37
+ // 関数名 Jaccard
38
+
39
+ // 概要 テストユーザと訓練ユーザ間のJaccard係数を算出
40
+
41
+ // 引数 x[i] :テストユーザの映画iに対する評価値
42
+
43
+ // y[i] :訓練ユーザの映画iに対する評価値
44
+
45
+ // 戻り値 なし
46
+
47
+ //------------------------------------------------------------------
48
+
11
- static double Jaccard(int[] x, int[] y){
49
+ static double Jaccard(int[] x, int[] y){
12
50
 
13
51
  double wa=0; //テストユーザが高評価を与えているアイテムの集合と訓練ユーザが高評価を与えているアイテムの集合の和集合による要素数を示す変数
14
52
 
@@ -38,9 +76,15 @@
38
76
 
39
77
  }
40
78
 
41
-
79
+ // Jaccard係数の計算を返す
80
+
42
-
81
+ return seki / wa;
82
+
83
+ }
84
+
85
+
86
+
43
- static double Euclid(int[] x, int[] y){
87
+ static double Euclid(int[] x, int[] y){
44
88
 
45
89
  double d=0;
46
90
 
@@ -60,22 +104,276 @@
60
104
 
61
105
 
62
106
 
107
+ }
108
+
109
+
110
+
111
+
112
+
63
113
  Main
64
114
 
115
+ package Class;
116
+
117
+ import Class.*;
118
+
119
+
120
+
121
+ import java.io.*;
122
+
123
+ import java.lang.*;
124
+
125
+ import java.util.ArrayList;
126
+
127
+ import java.util.List;
128
+
129
+ import java.util.Arrays;
130
+
131
+ import java.util.Comparator;
132
+
133
+ import java.text.DecimalFormat;
134
+
135
+
136
+
137
+ public class Main {
138
+
139
+ public static final int TESTUSER = 300; //テストユーザの数
140
+
141
+ public static final int OTHERUSER = 600; //訓練ユーザの数
142
+
143
+ public static final int ITEM = 1682; //アイテム総数
144
+
145
+ public static final int QUERYITEM = 10; //クエリアイテムの数
146
+
147
+ public static final int NEIGHBOR = 100; //近傍ユーザ数
148
+
149
+ public static final int RANK = 20; //推薦アイテムの数
150
+
151
+ public static final int VALIDATION= 3; //検定回数
152
+
153
+
154
+
155
+ public static void main(String[] args){
156
+
157
+ //フォーマットを定義
158
+
159
+ DecimalFormat df = new DecimalFormat("0.000");
160
+
161
+
162
+
163
+ //交差検定による推薦精度の評価指標
164
+
165
+ double[] AvePrec= new double[VALIDATION]; //検定iの全てのテストユーザの平均適合率
166
+
167
+ double[] AveReca= new double[VALIDATION]; //検定iの全てのテストユーザの平均再現率
168
+
169
+
170
+
171
+ //各テストユーザに対する推薦精度を出力するファイル名
172
+
173
+ String output = "Result/result"+NEIGHBOR+"_"+RANK+".txt";
174
+
175
+
176
+
177
+ for(int val=1; val<(VALIDATION+1); val++){ //val回目の検定を行う
178
+
179
+ //ファイルの定義
180
+
181
+ String input1 = "Dataset/test_"+val+".txt"; //テストユーザのデータファイルを指定
182
+
183
+ String input2 = "Dataset/training_"+val+".txt"; //訓練ユーザのデータファイルを指定
184
+
185
+ String input3 = "Dataset/query_"+val+".txt"; //クエリアイテムのデータファイルを指定
186
+
187
+
188
+
189
+ //テストユーザ・訓練ユーザのクエリアイテムに対する評価値
190
+
191
+ int[][] T_query = new int[TESTUSER+1][QUERYITEM+1];
192
+
193
+ int[][] O_query = new int[OTHERUSER+1][QUERYITEM+1];
194
+
195
+
196
+
197
+ //テストユーザ・訓練ユーザ・クエリアイテム・推薦アイテム
198
+
199
+ int[][] TestUser = new int[TESTUSER+1][ITEM+1];
200
+
201
+ int[][] OtherUser = new int[OTHERUSER+1][ITEM+1];
202
+
203
+ int[][] TestQuery = new int[TESTUSER+1][QUERYITEM+1];
204
+
205
+
206
+
207
+ //テストユーザ・訓練ユーザ間の類似度
208
+
209
+ double[][] sim = new double[TESTUSER+1][OTHERUSER+1];
210
+
211
+
212
+
213
+ //テストユーザに対する近傍ユーザの数・推薦アイテムの数
214
+
215
+ int[] NeiUser = new int[TESTUSER+1];
216
+
217
+ int[] Rank = new int[TESTUSER+1];
218
+
219
+
220
+
221
+ //推薦精度の評価指標
222
+
223
+ double[] prec = new double[TESTUSER+1]; //各テストユーザの適合率
224
+
225
+ double[] reca = new double[TESTUSER+1]; //各テストユーザの再現率
226
+
227
+ double[] tmp = new double[TESTUSER]; //適合率,再現率の平均値算出用の仮配列
228
+
229
+
230
+
231
+ //訓練ユーザのリスト(id,value,sim)・推薦アイテムのスコアのリスト(id,score)
232
+
233
+ UserList[][] OtherList = new UserList[TESTUSER+1][OTHERUSER+1];
234
+
235
+ ItemList[][] RecItem = new ItemList[TESTUSER+1][ITEM+1];
236
+
237
+
238
+
239
+ //テストユーザ・訓練ユーザ・クエリアイテムの読み込み・格納
240
+
241
+ FileIO.DataInput(TestUser,input1);
242
+
243
+ FileIO.DataInput(OtherUser,input2);
244
+
245
+ FileIO.DataInput(TestQuery,input3);
246
+
247
+
248
+
249
+ //クエリアイテムに対する評価値からテストユーザiと訓練ユーザj間の類似度を算出
250
+
251
+ for(int i=1; i<TestUser.length; i++){
252
+
253
+ for(int j=1; j<OtherUser.length; j++){
254
+
255
+ for(int k=1; k<TestQuery[i].length; k++){
256
+
257
+ T_query[i][k] = TestUser[i][TestQuery[i][k]];
258
+
259
+ O_query[j][k] = OtherUser[j][TestQuery[i][k]];
260
+
261
+ }
262
+
263
+
264
+
265
+ //Jaccard係数による類似度計算
266
+
65
- //sim[i][j] = Similarity.Jaccard(T_query[i],O_query[j]);この関数は実行できました。
267
+ //sim[i][j] = Similarity.Jaccard(T_query[i],O_query[j]);
66
-
67
- sim[i][j] = Similarity.Euclid(T_query[i],O_query[j]);
68
-
69
- ```
70
-
71
- Main.java:78: エラー: シンボルを見つけられません
72
268
 
73
269
  sim[i][j] = Similarity.Euclid(T_query[i],O_query[j]);
74
270
 
271
+
272
+
273
+
274
+
75
- ^
275
+ }
276
+
76
-
277
+ }
278
+
279
+
280
+
281
+
282
+
283
+ //訓練ユーザのリスト作成・近傍ユーザの形成
284
+
285
+ for(int i=1; i<TestUser.length; i++){
286
+
287
+ NeiUser[i]=Recommend.Neighbor(OtherUser, sim[i], OtherList[i], NEIGHBOR);
288
+
289
+ //System.out.println("[テストユーザ"+i+"の近傍ユーザ"+NEIGHBER+"("+NeiUser[i]+")人]");
290
+
291
+ //for(int j=0; j<NeiUser[i]; j++)
292
+
293
+ // OtherList[i][j].printList();
294
+
295
+ }
296
+
297
+
298
+
299
+ //テストユーザに対する推薦アイテムのスコア値を算出
300
+
301
+ for(int i=1; i<TestUser.length; i++){
302
+
303
+ Recommend.Predict(T_query[i], OtherUser, NeiUser[i], OtherList[i], RecItem[i]);
304
+
305
+ //System.out.println("[テストユーザ"+i+"の推薦アイテムのスコア");
306
+
307
+ //for(int j=0; j<(ITEM+1); j++)
308
+
309
+ // RecItem[i][j].printList();
310
+
311
+ }
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+ //推薦アイテムの上位N件を選出
320
+
321
+ for(int i=1; i<TestUser.length; i++){
322
+
323
+ Rank[i]=Recommend.Ranking(TestQuery[i], RANK, RecItem[i]);
324
+
325
+ //System.out.println("[テストユーザ"+i+"の推薦アイテム"+RANK+"("+Rank[i]+")件]");
326
+
327
+ //for(int j=0; j<Rank[i]; j++)
328
+
77
- シンボル: メソッド Euclid(int[],int[])
329
+ // RecItem[i][j].printList();
330
+
78
-
331
+ }
332
+
333
+
334
+
79
- 場所: クラス Similarity
335
+ //推薦精度を算出
336
+
80
-
337
+ for(int i=1; i<TestUser.length; i++){
338
+
339
+ prec[i]= Score.Precision(TestUser[i], RecItem[i], Rank[i]);
340
+
341
+ reca[i]= Score.Recall(TestUser[i], RecItem[i], T_query[i], Rank[i]);
342
+
343
+ //System.out.print("TestUser:"+i+"\tPrecision:"+df.format(prec[i]));
344
+
345
+ //System.out.println("\tRecall:"+df.format(reca[i]));
346
+
81
- エラー1個
347
+ }
348
+
349
+
350
+
351
+ System.arraycopy(prec,1,tmp,0,tmp.length); //適合率の配列を仮配列にコピー
352
+
353
+ AvePrec[val-1] = Statistic.Average(prec);
354
+
355
+ System.arraycopy(reca,1,tmp,0,tmp.length); //再現率の配列を仮配列にコピー
356
+
357
+ AveReca[val-1] = Statistic.Average(reca);
358
+
359
+ //System.out.print("["+val+"]Averaged_Precision:"+(AvePrec[val-1]));
360
+
361
+ //System.out.println("\tAveraged_Recall:"+(AveReca[val-1]));
362
+
363
+ FileIO.DataOutput(TestUser,prec,reca,val,output);
364
+
365
+ }
366
+
367
+
368
+
369
+ FileIO.DataOutput(Statistic.Average(AvePrec),Statistic.Average(AveReca),output);
370
+
371
+ System.out.print("All_Precision:"+df.format(Statistic.Average(AvePrec)));
372
+
373
+ System.out.println("\tAll_Recall:"+df.format(Statistic.Average(AveReca)));
374
+
375
+
376
+
377
+ }
378
+
379
+ }