如何与itertools进行列式交叉

时间:2015-05-09 20:04:42

标签: python-2.7 machine-learning cluster-analysis data-mining k-means

当我计算(m)训练样本的每个训练数据之间的jaccard相似度时,每个训练样本具有6个特征(年龄,职业,性别,产品范围,产品_猫和产品),形成(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

我得到的矩阵是

enter image description here

Problem Statement:

如果您在红色框下面看到显示样本数据集的行(1104)和(1101)的相似性的值。如果你查看它们各自的列,这两行不相似,但值0.16是因为术语" Business"出现在"职业"行(1104)和" product_cat"行(1101)的列,当获取行的交集时将结果给出为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) 

1 个答案:

答案 0 :(得分:1)

最简单的方法是为所有条目添加特定于列的前缀。已解析行的示例:

row = ["ID:1100", "AGE:25-34", "Occupation:IT", "Gender:M", "Product_range:50-60", "Product_cat:Gaming", "Product:XPS 6610"]

还有很多其他的方法,包括将每一行分成一组k-mers并应用基于Jaccard的MinHash算法来比较这些集合,但在你的情况下不需要这样的东西。