当我计算(m)个训练示例的每个训练数据之间的jaccard相似度时,每个训练数据具有6个特征(年龄,职业,性别,Product_range,Product_cat和Product),形成(m * m)相似度矩阵。
对于矩阵我得到了不同的结果。我已经确定了问题的根源,但没有针对该问题提供优化的解决方案。
在下面找到数据集的样本:
ID AGE Occupation Gender Product_range Product_cat Product
1100 25-34 IT M 50-60 Gaming XPS 6610
1101 35-44 Research M 60-70 Business Latitude lat6
1102 35-44 Research M 60-70 Performance Inspiron 5810
1103 25-34 Lawyer F 50-60 Business Latitude lat5
1104 45-54 Business F 40-50 Performance Inspiron 5410
我得到的矩阵是
Problem Statement:
如果您在红色框下看到显示样本数据集行(1104)和(1101)相似性的值。如果查看它们各自的列,这两行并不相似,但是值0.16是因为在行(1104)的“职业”列和行(1101)的“ product_cat”列中存在术语“业务”当采取行的交点时,结果为1。
我的代码只使用两行的交集,而无需查看列。如何更改代码以处理这种情况并保持性能相同。
My code:
half_matrix=[]
for row1, row2 in itertools.combinations(data_set, r=2):
intersection_len = row1.intersection(row2)
half_matrix.append(float(len(intersection_len)) /tot_len)
最佳答案
最简单的方法是为所有条目添加特定于列的前缀。解析行的示例:
row = ["ID:1100", "AGE:25-34", "Occupation:IT", "Gender:M", "Product_range:50-60", "Product_cat:Gaming", "Product:XPS 6610"]
有许多其他方法可以解决此问题,包括将每一行分成一组k-mers,并应用基于Jaccard的MinHash算法来比较这些集合,但在您的情况下无需这样做。