我对数据挖掘或数据分析或统计分析没有任何线索,但我认为我需要的是在矩阵中找到"集群"。我有一个约20k记录的数据集,每个记录有~40个特征,所有这些记录都可以打开或关闭。
+--------+------+------+------+------+------+------+
| record | hasA | hasB | hasC | hasD | hasE | hasF |
+--------+------+------+------+------+------+------+
| foo | 1 | 0 | 1 | 0 | 0 | 0 |
| bar | 1 | 1 | 0 | 0 | 1 | 1 |
| baz | 1 | 1 | 1 | 0 | 0 | 0 |
+--------+------+------+------+------+------+------+
我相信这些20k记录中的大部分都具有属于几个类别之一的特征。必须有办法确定类似记录的相似之处。是记录' bar'。
那么,我实际上在看什么呢?我在找什么算法?
答案 0 :(得分:0)
将每条记录r
转换为二进制向量v(r)
,以便i
v(r)
的{{1}}成分设置为1
r
具有i
- 特征,而0
则为。
现在在hierarchical clustering或Hamming distance下的这组向量上运行Jaccard distance算法,无论您认为哪个更合适;还要确保根据基础距离定义的聚类之间的距离概念(参见linkage criteria)。
然后根据常识决定在哪里削减结果dendrogram。切割树形图的位置会影响簇的数量。
层次聚类的一个缺点是它相当慢。一般来说需要O(n^3)
个时间,因此在大型数据集上需要相当长的时间。对于单一链接和完整链接,您可以将时间缩短到O(n^2)
。
分层聚类很容易在Python等语言中实现。您还可以使用scipy
库中的实现。
这是一个让您入门的代码段。我假设S
是转换为二进制向量的记录集(即S
中的每个列表对应于数据集中的记录)。
import numpy as np
import scipy
import scipy.cluster.hierarchy as sch
import matplotlib.pylab as plt
# This is the set of binary vectors, each of which would
# correspond to a record in your case.
S = [
[0, 0, 0, 1, 1], # 0
[0, 0, 0, 0, 1], # 1
[0, 0, 0, 1, 0], # 2
[1, 1, 1, 0, 0], # 3
[1, 0, 1, 0, 0], # 4
[0, 1, 1, 0, 0]] # 5
# Use Hamming distance with complete linkage.
Z = sch.linkage(sch.distance.pdist(S, metric='hamming'), 'complete')
# Compute the dendrogram
P = sch.dendrogram(Z)
plt.show()
结果如你所料:在0.5处切割得到两个簇,前三个向量之一(开头有一个,末尾有零),最后三个向量中有一个(有一个最后,开头是零)。这是图像:
分层聚类从每个向量作为其自己的聚类开始。在每个连续的步骤中,它合并最接近的簇。它会重复这个,直到剩下一个簇。
树形图基本上编码整个聚类过程。在开始时,每个向量都是它自己的集群。然后{3}
和{5}
合并为{3,5}
,{0}
和{2}
合并为{0,2
}。接下来,{4}
和{3,5}
合并到{3,4,5}
,{1}
和{0,2}
合并到{0,1,2}
。最后,{0,1,2}
和{3,4,5}
合并为{0,1,2,3,4,5}
。
从树形图中,您通常可以看到切割最有意义的点 - 这将定义您的簇。
我鼓励您尝试各种距离(例如汉明距离,Jaccard距离)和联系(例如单链接,完整链接)和各种表示(例如二元向量)。
答案 1 :(得分:0)
您确定要进行群集分析吗?
要查找类似记录,您不需要进行群集分析。只需找到具有任何距离测量的类似记录,例如Jaccard相似度或汉明距离(两者都用于二进制数据)。或余弦距离,以便您可以使用例如Lucene快速找到类似的记录。
要查找常见模式,使用频繁项集挖掘可能会产生更有意义的结果,因为这些只能处理属性的子集。例如,在超市中,Noodles,Tomato,Basil,Cheese等列可能构成频繁的模式。
大多数聚类算法都试图将数据划分为k个组。虽然这最初看起来是一个好主意(获得k个目标组),但很少与真实数据包含的内容相匹配。例如客户:为什么每个客户都属于一个受众?如果观众是例如,该怎么办?汽车爱好者,枪支爱好者,足球爱好者,足球妈妈 - 你确定你不想让这些团体重叠吗? 此外,群集分析的一个问题是它非常容易使用。它不会“失败” - 你总是得到一个结果,你可能没有意识到这是一个糟糕的结果......
答案 2 :(得分:-1)
您可以先尝试k-means聚类。然后是分层聚类。您可能希望将群集数量设置为您拥有的群集数量。
k-means聚类示例:
https://nxsheet.com/sheets/56fb78812efc70776ddce752
将您的聚类和Set变量放在散点图上。您可以查看Set变量和群集之间是否存在关系。