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

我有一份客户和特征的列表,格式如下:

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]返回第二行,而Customers[1][0]返回该行的用户ID(1619201613)。

用户ID可以在其他行中重复出现(新交易),因为重复的客户会被添加到列表中。例如,请注意Customers[4][0]返回相同的用户ID(1619201613),但Customers[4]的特征与Customers[1]的特征不同——即,客户返回并购买了具有不同特征的不同产品。

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

  1. 将不同的用户ID分组。因此,第一个问题是:如何高效地将单个用户ID的所有不同特征组合在一起,例如,将Customers[1]Customers[4]合并成一行(新列表?)的形式:
    ['1619201613', '-1384105381', '1433106581', '1445361759', '587903155', '-739953679', '-1002282042', '-481818422']

  2. 通过他们的交易寻找客户的相似性。因此,第二个问题是:如何高效地评估一个在[0,1]范围内的相似性函数,以判断两个不同的客户是否对相同的东西感兴趣?


附注:

  1. 特征的顺序并不重要,因为它们是经过哈希处理并唯一识别的。
  2. 特征的基数也不重要,即我们不关心同一个用户ID的相同特征是否出现两次或三次。
  3. 这件事的最终结果是能够得到一个客户网络,其中用户ID是节点,节点之间的边由相似性分数加权。
  4. 我倾向于使用余弦相似性或Jaccard指数,但也对其他方法持开放态度。
  5. 我需要速度和可扩展性,即使这会牺牲一些准确性,当然这只是在小范围内。
  6. 我已经彻底检查了之前的问题——例如,以下问题不相关:计算两个列表的相似性Python检查多个列表的相似性如何计算特征列表之间的相似性?

回答:

这回答了你的问题的一部分:

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 collectionsdata = 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()]

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注