これは推奨システムです。
Python で : 1.081743 / 0.540871 を入力すると、結果は : 2.0000018488696933 です。
しかし、プログラムでは: 結果は: 2.0
Python コードは次のとおりです。
def getRecommendations(prefs, person, n = 50, k = 5, similarity = sim_cosine):
totals = {}
simSums = {}
sims = topMatches(prefs, person, n, similarity)
print("Neigh: " +str(sims) + "\n")
for item in sims:
other = item[1]
for i in prefs[other]:
if i not in filterKeys:
if i not in prefs[person] or prefs[person][i] == 0 :
totals.setdefault(i,0)
totals[i] += prefs[other][i] * item[0]
simSums.setdefault(i,0)
simSums[i] += item[0]
rankings = []
for item,total in totals.items():
if simSums[item] == 0 : continue
print("Person: %s, Total :%f , simSum :%f, Item: %s" %(person, total,
simSums[item], item))
ここでランキングにフロートと文字列のリストを追加します
rankings.append([float(total / (simSums[item] * 1.0)), item])
print("\nRankings Before Sort:")
print(rankings)
rankings.sort()
rankings.reverse()
print("\nRankings After Sort:")
print(rankings)
print("***************************************************************\n")
return rankings[0:k]
結果は次のとおりです。
隣人: [(0.5408713866765542, '3'), (0.510809444238797, '7')]
人: 2、合計:2.163486、simSum:0.540871、項目: 1
人: 2、合計:1.081743、simSum:0.540871、項目: 2
人: 2、合計:1.021619、simSum:0.510809、アイテム: 7
ソート前のランキング: [[4.0, '1'], [2.0, '2'], [2.0, '7']]
ソート後のランキング: [[4.0, '1'], [2.0, '7'], [2.0, '2']]
実際には、 1.081743 / 0.540871 = 2.0000018488696933 1.021619 / 0.510809 = 2.0000019576788977 ですが、リストに追加すると 2.0 に切り捨てられます
このコードでは:
rankings = []
total = 1.081743
sim = 0.540871
rankings.append([total / sim,'ttt'])
print(rankings)
結果は OK です: [[2.0000018488696933, 'ttt']]
別のデータはこちら
隣人: [(0.5204800389058843, '3'), (0.510809444238797, '2')]
人: 7、合計:2.081920、simSum:0.520480、項目: 1
人: 7、合計:4.115487、simSum:1.031289、アイテム: 9
人: 7、合計:1.040960、simSum:0.520480、アイテム: 2
人: 7、合計:2.043238、simSum:0.510809、項目: 10
ソート前のランキング: [[4.0, '1'], [3.9906228126775822, '9'], [2.0, '2'], [4.0, '10']]
並べ替え後のランキング: [[4.0, '10'], [4.0, '1'], [3.9906228126775822, '9'], [2.0, '2']]
フォーマット文字列には何もないと思います なぜ???
下手な英語でごめんなさい