4

次の形式の顧客と機能のリストがあります。

UserID, Feature1, Feature2, Feature3, Feature4

「Customers」という名前のリストがあり、次のようになります。

[
['975676924', '1345207523', '-1953633084', '-2041119774', '587903155'], 
['1619201613', '-1384105381', '1433106581', '1445361759', '587903155'], 
['-1470352544', '-1068707556', '-1002282042', '-563691616', '587903155'], 
['-1958275692', '-739953679', '69580355', '-481818422', '587903155'],
['1619201613', '-739953679', '-1002282042', '-481818422', '587903155']
]

各行は、特定の特性を持つトランザクションです。各行の最初の要素は、そのトランザクションを実行しているユーザー ID (顧客) です。したがって、Customers[1]2 行目をCustomers[1][0]指定し、その行の UserID を指定します ( 1619201613)。

繰り返しの顧客がリストに追加されるため、UserID は他の行 (新しいトランザクション) で繰り返すことができます。したがって、たとえば、Customers[4][0]は同じ UserID ( 1619201613) を与えますが、 の機能は の機能とCustomers[4]同じではないことに注意してくださいCustomers[1]。つまり、顧客が戻ってきて、異なる機能を持つ別の製品を購入しました。

ここで重要な質問があります:リスト内の 2 つの異なる顧客それぞれの類似性を効率的に計算するにはどうすればよいでしょうか? 質問は実際には2つの異なる質問/タスクに分割する必要があると思います:

  1. 個別の UserID をグループ化します。したがって、最初の質問は次のとおりです。単一の UserID のすべての個別の機能を効率的にまとめるにはどうすればよいですか。たとえば、Customers[1]Customers[4]を次の形式の単一の新しい行 (新しいリスト?) に入れるには:
    ['1619201613', '-1384105381', '1433106581', '1445361759', '587903155', '-739953679', '-1002282042', '-481818422']

  2. トランザクションを通じて顧客の類似性を見つける。2 番目の質問は、[0,1]2 人の異なる顧客が同じものに興味を持っているかどうかを示す類似関数を効率的に評価するにはどうすればよいかということです。


PS。いくつかの追加メモ:

  1. 機能はハッシュされ、一意に識別されるため、機能の順序は重要ではありません。
  2. 機能のカーディナリティも重要ではありません。つまり、同じ UserID に対して同じ機能が 2 回または 3 回表示されてもかまいません。
  3. この全体の最終結果は、顧客のネットワークを取得できるようになることです。ここで、UserID はノードであり、それらの間のエッジは類似度スコアによって重み付けされます。
  4. 私は余弦類似度または Jaccard インデックスを好む傾向がありますが、代替案も受け入れます。
  5. もちろん、ある程度の精度が犠牲になるとしても、スピードとスケーラビリティが必要です。
  6. 以前の質問を徹底的に確認しました。たとえば、次の質問は該当しません。2 つのリストの類似性を計算する複数のリストの類似性をチェックする Python ; 特徴のリスト間の類似性を計算する方法は?
4

2 に答える 2

1

これはあなたの質問のパート1に答えます:

raw_data = [
['975676924', '1345207523', '-1953633084', '-2041119774', '587903155'],
['1619201613', '-1384105381', '1433106581', '1445361759', '587903155'],
['-1470352544', '-1068707556', '-1002282042', '-563691616', '587903155'],
['-1958275692', '-739953679', '69580355', '-481818422', '587903155'],
['1619201613', '-739953679', '-1002282042', '-481818422', '587903155']
]

import collections
data = collections.defaultdict(list)

for line in raw_data:
    data[line[0]].extend(line[1:])

これで、id をキーとする辞書ができました。

defaultdict(<type 'list'>, {
'1619201613': 
         ['-1384105381', '1433106581', '1445361759', '587903155',
          '-739953679', '-1002282042', '-481818422', '587903155'],  
'-1470352544': 
         ['-1068707556', '-1002282042', '-563691616', '587903155'], 
 '975676924': 
        ['1345207523', '-1953633084', '-2041119774', '587903155'],
 '-1958275692':
         ['-739953679', '69580355', '-481818422', '587903155']})  

次のように並べ替えることで、目的のリストを取得できます。

data_list = [[key] + value for key, value in data.items()]
于 2013-05-29T12:55:07.527 に答える