2012-07-30 60 views
1

我有一個模型本身(非Hadoop的):亨利馬烏:正火UserSimilarity距離

DataModel data = new FileDataModel(new File("file.csv")); 
UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel); 
userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(data)); 
UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(1, userSimilarity, data); 

userSimilarity不是[0100]之間的歸一化,例如,因此,如果想以顯示它給最終用戶,我使用以下溶液:

long maxSim = userSimilarity.userSimilarity(userId1, userNeighborhood.getUserNeighborhood(userId1)[0]); 
long finalSimilarity = Math.min(100, Math.max((int) Math.ceil(100 * userSimilarity.userSimilarity(userId1, userId2)/maxSim), 0)) 

我觀察到的性能問題與該(各種秒爲每個用戶),有另一種可能,或以具有分鐘(相似性)= 0和max(相似性)= 100爲最快的方式每個給定的用戶?

回答

3

您的性能問題與您的規範化無關,並且與計算的其餘部分無關。我不會使用AveragingPreferenceInferrer的方式。它減慢了速度,很少有幫助。您也可以更快速地找到所有用戶,並計算相似度以找到最相似的用戶。計算1的鄰域大致相同但接近一點。

皮爾遜相關性在[-1,1]中。如果你想要它在[0,100]範圍內,只需使用50 *(1 +相關)。