我有以下格式的客户和功能列表:
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]
给出该行的用户ID(1619201613
)。
UserID可以在其他行(新事务)中重复,因为重复客户将被附加到列表中。因此,例如,请注意Customers[4][0]
提供相同的用户ID(1619201613
),但Customers[4]
的功能与Customers[1]
的功能不同 - 即,客户回来后购买了具有不同功能的不同产品。
所以这是一个核心问题:我如何有效地计算列表中每两个不同客户之间的相似度?
我认为这个问题实际上应该分成两个不同的问题/任务:
将不同的UserID组合在一起。所以第一个问题是:如何有效地将单个UserID的所有不同功能组合在一起,例如,Customers[1]
和Customers[4]
被放入一个新行(新列表?)形式:
['1619201613', '-1384105381', '1433106581', '1445361759', '587903155', '-739953679', '-1002282042', '-481818422']
通过交易查找客户的相似度。所以第二个问题是:我如何有效地评估[0,1]
中的相似度函数,告诉我两个不同的客户是否对相同的东西感兴趣?
PS。一些补充说明:
答案 0 :(得分:1)
步骤1:假设您的列表名为l
,对不同的用户进行分组summary = {} # init a map for group
for entry in l:
if summary[entry[0]]:
summary[entry[0]] += entry[1:]
else:
summary[entry[0]] = entry[1:]
# delete duplicate element
for s in summary:
summary[s] = [int(x) for x in list(set(summary[s]))]
步骤2:构建一个网络,实际上是一个二维数组,并计算不同用户之间的相似性。
# the row and column number of this array
cnt = len(summary)
network = [[0] * cnt] * cnt
index = [x for x in summary]
for x, xvalue in enumerate(index):
for y, yvalue in enumerate(index):
common = len(set(summary[xvalue]) & set(summary[yvalue]))
network[x][y] = common
现在,network是一个二维数组,包含每个UserID之间的公共项目编号。
例如,您的列表是:
[['100', '2', '3','4'],
['110', '2', '5', '6'],
['120', '6', '3', '4']]
然后网络是:
[[3, 1, 2],
[1, 3, 1],
[2, 1, 3]]
部分代码来自this question
答案 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为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()]