2

私は python の初心者ですが、ガイドブックで提供されている例を繰り返そうとすると、いくつかの問題があります。この例は、推奨アルゴリズムに関するものです。この例では、特定のアイテムを評価したユーザーを格納するアイテム リストを実装しようとしています。これはコードです(python 2.7)

def UserSimilarity(train):
    #build inverse table for item_users
    item_users=dict()
    for u,items in train.items():
        for i in items.keys():
            if i not in item_users:
                item_users[i]=set()              
            item_users[i].add(u)


    #calculate co-rated items between users
    C=dict()
    N=dict()
    for i, users in item_users.items():
        print i,users
        #print N[u]
        for u in users:
            N[u]=N[u]+1
            print N[u]
            for v in users:
                print C[u][v]
                if u==v:
                    continue
                C[u][v]=C[u][v]+1

    #calculate finial similarity matrix W
    W=dict()
    for u, related_users in C.items():
        for v, cuv in related_users.items():
            W[u][v]=cuv/math.sqrt(N[u]*N[v])
    return W

ps: 「train」のデータ形式は辞書などです{UserId1:{ItemId1:Ratings1,ItemId2,Rating2,...},...}

私が出会った問題は、

Traceback (most recent call last):
  File "D:\Users\Administrator\workspace\GroupLens\src\test3.py", line 82, in <module>
    UserSimilarity(train_dic)
  File "D:\Users\Administrator\workspace\GroupLens\src\test3.py", line 66, in UserSimilarity
    N[u]=N[u]+1
KeyError: '3'

私はそれを改善する方法がわからないので、誰かが私を助けてくれることを願っています! どうもありがとう!!

4

2 に答える 2

0

どうもありがとう!ええ、問題は私がN[u]に初期値を割り当てなかったことです。あなたの答えは大いに役立ち、それから私は多くを学びました!タイムリーなサポートをありがとうございました!以下は修正され成功したエディションです〜

修正版

def UserSimilarity(train):
    #build inverse table for item_users
    item_users=dict()
    for u,items in train.items():
        for i in items.keys():
            if i not in item_users:
                item_users[i]=set()              
            item_users[i].add(u)
            
    #calculate co-rated items between users
    C=dict()
    N=dict()
    for i, users in item_users.items():
        for u in users:
            if u in N.keys():
                N[u] +=1
            else:
                N[u]=0                

            for v in users:
                if u==v:
                    continue
                elif u in C.keys():
                    if v in C[u].keys():
                        C[u][v] +=1
                    else:
                        C[u][v] =1
                else:
                    C[u]=dict({v:1})

    #calculate final similarity matrix W
    W=dict()
    for u, related_users in C.items():
        W[u]=dict()
        for v, cuv in related_users.items():
            W[u][v] = cuv/math.sqrt(N[u]*N[v])
于 2012-12-10T16:49:49.030 に答える
0

主な問題は、新しい辞書()を定義してN = dict()から、を繰り返し処理してusers、特定のユーザーに基づいて辞書キーを作成しようとしていることです。その部分は問題ありませんが、これを行うと問題が発生します。

N[u]=N[u]+1

ディクショナリに値を割り当てることは問題ありませんが、右側を見てください。まだ存在しない場合は、N[u]の値に割り当てようとしています(したがってエラーが発生します)。全体的な目標が100%わからないので(これは誤った方向に進む可能性があります)、ユーザーの発生回数に基づいて数値をインクリメントすることが目的の場合は、次のタイプで作成されたを使用できます。引数(ここでは)。これは、キーが見つからない場合(上記のエラーのように)、デフォルト値は宣言したタイプ(ここ)に基づいていることを意味します。N[u] + 1N[u]defaultdictint0

In [1]: from collections import defaultdict

In [2]: N = defaultdict(int)

In [3]: users = [1, 2, 3, 2, 1, 2]

In [4]: for u in users:
   ...:     N[u] += 1
   ...:     
   ...:     

In [5]: N
Out[5]: defaultdict(<type 'int'>, {1: 2, 2: 3, 3: 1})

または、通常の辞書を使用することもできますが、getメソッドを使用すると、見つかった場合は値を返し、見つからなかった場合はデフォルトを返します(自分で指定できるデフォルト)。

In [1]: N = dict()

In [2]: users = [1, 2, 3, 2, 1, 2]

In [3]: for u in users:
   ...:     N[u] = N.get(u, 0) + 1
   ...:     
   ...:     

In [4]: N
Out[4]: {1: 2, 2: 3, 3: 1}
于 2012-12-10T08:07:40.703 に答える