如何使用 itertools 进行列交叉
How to do column wise intersection with itertools
当我计算 (m) 个训练示例的每个训练数据之间的 jaccard 相似度时,每个训练示例具有 6 个特征(年龄、职业、性别、Product_range、Product_cat 和产品),形成一个(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 是因为术语 "Business" 出现在行 (1104) 的 "occupation" 列和行的 "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)
最简单的方法是为所有条目添加特定于列的前缀。已解析行的示例:
row = ["ID:1100", "AGE:25-34", "Occupation:IT", "Gender:M", "Product_range:50-60", "Product_cat:Gaming", "Product:XPS 6610"]
还有很多其他方法可以解决这个问题,包括将每一行拆分为一组 k-mers 并应用基于 Jaccard 的 MinHash 算法来比较这些集合,但在您的情况下没有必要这样做。
当我计算 (m) 个训练示例的每个训练数据之间的 jaccard 相似度时,每个训练示例具有 6 个特征(年龄、职业、性别、Product_range、Product_cat 和产品),形成一个(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 是因为术语 "Business" 出现在行 (1104) 的 "occupation" 列和行的 "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)
最简单的方法是为所有条目添加特定于列的前缀。已解析行的示例:
row = ["ID:1100", "AGE:25-34", "Occupation:IT", "Gender:M", "Product_range:50-60", "Product_cat:Gaming", "Product:XPS 6610"]
还有很多其他方法可以解决这个问题,包括将每一行拆分为一组 k-mers 并应用基于 Jaccard 的 MinHash 算法来比较这些集合,但在您的情况下没有必要这样做。