如何找到一个矩阵的簇

时间:2016-03-29 19:49:04

标签: machine-learning cluster-analysis data-analysis

我对数据挖掘或数据分析或统计分析没有任何线索,但我认为我需要的是在矩阵中找到"集群"。我有一个约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'。

那么,我实际上在看什么呢?我在找什么算法?

3 个答案:

答案 0 :(得分:0)

将每条记录r转换为二进制向量v(r),以便i v(r)的{​​{1}}成分设置为1 r具有i - 特征,而0则为。

现在在hierarchical clusteringHamming distance下的这组向量上运行Jaccard distance算法,无论您认为哪个更合适;还要确保根据基础距离定义的聚类之间的距离概念(参见linkage criteria)。

然后根据常识决定在哪里削减结果dendrogram。切割树形图的位置会影响簇的数量。

层次聚类的一个缺点是它相当慢。一般来说需要O(n^3)个时间,因此在大型数据集上需要相当长的时间。对于单一链接和完整链接,您可以将时间缩短到O(n^2)

分层聚类很容易在Python等语言中实现。您还可以使用scipy库中的实现。

示例:Python中的分层聚类

这是一个让您入门的代码段。我假设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处切割得到两个簇,前三个向量之一(开头有一个,末尾有零),最后三个向量中有一个(有一个最后,开头是零)。这是图像:

enter image description here

分层聚类从每个向量作为其自己的聚类开始。在每个连续的步骤中,它合并最接近的簇。它会重复这个,直到剩下一个簇。

树形图基本上编码整个聚类过程。在开始时,每个向量都是它自己的集群。然后{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变量和群集之间是否存在关系。