1

私はそのようなモデルを持っています(非Hadoop):

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 は [0,100] の間で正規化されていないため、エンド ユーザーに表示する場合は、次のソリューションを使用します。

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))

これでパフォーマンスの問題が発生しました(ユーザーごとにさまざまな秒)。別の可能性、または特定のユーザーごとに min(similarity) = 0 および max(similarity) = 100 にする最も簡単な方法はありますか?

4

1 に答える 1

3

パフォーマンスの問題は正規化とは何の関係もありません。すべては計算の残りの部分と関係があります。

ちなみに使いませんAveragingPreferenceInferrer。それは物事を遅くし、めったに助けません。また、すべてのユーザーをループして類似度を計算し、最も類似しているユーザーを見つける方が速い場合もあります。1の近傍の計算はほぼ同じですが、少し近くなります。

ピアソン相関は[-1,1]にあります。[0,100]の範囲にする場合は、50 *(1 +相関)を使用します。

于 2012-07-30T10:56:58.903 に答える