Python中列表的相似性 – 根据客户的特征比较客户

我有以下格式的客户和功能列表:

UserID, Feature1, Feature2, Feature3, Feature4

所以我有一个列表 – 称为“客户” – 它看起来像这样:

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

每一行都是具有特定特征的交易.每行中的第一个元素是执行该事务的UserID(客户).因此,Customers [1]给出第二行,Customers [1] [0]给出该行的UserID(1619201613).

UserID可以在其他行(新事务)中重复,因为重复客户将被附加到列表中.因此,例如,请注意Customers [4] [0]给出相同的UserID(1619201613),但Customers [4]的功能与Customers [1]的功能不同 – 即客户回来了买了一个具有不同功能的不同产品.

所以这是一个核心问题:如何有效地计算列表中每两个不同客户之间的相似性?
我认为这个问题实际上应该分成两个不同的问题/任务:

>将不同的UserID组合在一起.所以第一个问题是:如何有效地将单个UserID的所有不同功能组合在一起,以便将例如Customers [1]和Customers [4]放入一个新的行(新列表?)中.形成:
[‘1619201613′,’ – 1384105381′,’1433106581′,’1445361759′,’587903155′,’ – 739953679′,’ – 1002282042′,’ – 481818422′]
>通过交易查找客户的相似性.所以第二个问题是:如何有效地评估[0,1]中的相似度函数,告诉我两个不同的客户是否对相同的东西感兴趣?

PS.一些额外的说明:

>功能的顺序无关紧要,因为它们是经过散列和唯一标识的.
>功能的基数也无关紧要,即我们不关心相同的功能是否出现相同的UserID两次或三次.
>整个事情的最终结果是能够获得客户网络,其中UserID是节点,并且它们之间的边缘由相似性得分加权.
>我倾向于选择余弦相似度或Jaccard指数,但愿意接受替代方案.
>我需要速度和可扩展性,即使这会牺牲一些准确性,在很短的程度上.
>我已经彻底检查了以前的问题 – 例如,以下是不相关的:Calculating the similarity of two lists; Python Checking Multiple Lists For Similarities; How to compute the similarity between lists of features?

最佳答案 这回答了你的第一部分问题:

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为key的字典:

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()]
点赞