0

これは推奨システムです。

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']]


フォーマット文字列には何もないと思います なぜ???

下手な英語でごめんなさい

4

1 に答える 1

2

この問題は、値を代入する際の精度の低下とは関係ありませんが、数値が Python でデフォルトの精度 6 で表示されるという事実に関係しています。 注:

>>> x = 1.081743 / 0.540871
>>> x
2.0000018488696933
>>> "%f" % x
'2.000002'

より正確に表示するには、フォーマット文字列に幅と精度を追加します

>>> "%21.19f" % x
'2.0000018488696933439'

実際に 1.081743 と 0.540871 が本当にあなたの値であれば、それらを割り当てるのに何の問題もありません:

>>> total = 1.081743
>>> sum = 0.540871
>>> rankings = []
>>> rankings.append([float(total/sum), 'ttt'])
>>> rankings
[[2.0000018488696933, 'ttt']]
>>> rankings.sort()
>>> rankings
[[2.0000018488696933, 'ttt']]

しかし、ここに本当の問題があります。あなたはこれらの値を使用していると主張しています:

Person: 2, Total :2.163486 , simSum :0.540871, Item: 1
Person: 2, Total :1.081743 , simSum :0.540871, Item: 2
Person: 2, Total :1.021619 , simSum :0.510809, Item: 7

おそらく、次のような値が表示されると予想されます。

>>> 2.163486 / 0.540871
4.000003697739387
>>> 1.081743 / 0.540871
2.0000018488696933
>>> 1.021619 / 0.510809
2.0000019576788977

しかし、実際に表示されているのは 4.0、2.0、および 2.0 です。どうしてこれなの?その理由は、表示されている値がすでに小数点以下 6 桁に丸められているため、計算している実際の値ではないからです!

1.081743 / 0.540871_これらの 2 つの数値は、割る実際の値の近似値であるため、実際には割っていません。そして、2 つの実際の数値の比率はちょうど 2.0 です。そのため、2.0 が表示されます。

私はそれをさらに明確にしようとします。このスクリプトを勉強してください。それはあなたがしたことを示しています。2 つの完全に適切な数を取り、それらを 6 桁の小数部に丸め、それらを計算しようとしたところ、別の商が見つかりました。

>>> total = 1.0817427733531084
>>> sim = 0.5408713866765542
>>> total / sim
2.0
>>> print "%f" % total 
1.081743
>>> print "%f" % sim
0.540871
>>> 1.081743 / 0.540871
2.0000018488696933
于 2013-10-08T08:24:56.160 に答える