我有一个数据集,我想仅基于一个变量(没有缺失值)在该数据上创建集群。我想根据那个变量创建 3 个集群。
使用哪种聚类算法,k-means、EM、DBSCAN 等?
我的主要问题是,在什么情况下我应该使用 k-means over EM 或 EM over k-means?
我有一个数据集,我想仅基于一个变量(没有缺失值)在该数据上创建集群。我想根据那个变量创建 3 个集群。
使用哪种聚类算法,k-means、EM、DBSCAN 等?
我的主要问题是,在什么情况下我应该使用 k-means over EM 或 EM over k-means?
对于一维聚类,K-means 算法和 EM 算法将非常相似。
在 K-means 中,您首先猜测均值在哪里,然后将每个点分配给具有最接近均值的集群,然后根据当前的点分配重新计算均值(和方差),然后更新点的分配,然后更新办法 ...
在 EM 中,您还可以先猜测均值在哪里,然后计算分配的预期值(基本上是每个点在每个集群中的概率),然后使用预期值更新估计的均值(和方差)作为权重,然后计算新的期望值,然后计算新的均值,...
主要区别在于,在 K-means 中将点分配给集群是全有或全无,其中 EM 给出了组成员资格的比例/概率(一个点可能被视为具有 80% 的概率属于 A 组,18% 的概率属于 B 组,属于 C 组的概率为 2%)。如果组之间有很多分离,那么这两种方法将给出非常相似的结果。但如果有相当多的重叠,那么 EM 可能会给出更有意义的结果(如果对方差/标准偏差感兴趣,则结果会更多)。但是,如果您只关心分配组成员而不关心参数,那么 K-means 可能更简单。
为什么不两者都做,看看答案有多么不同?如果它们相似,则选择更简单的,如果它们不同,则决定将分组与数据和外部知识进行比较。
EM 在结果方面优于 k-means。
然而,K-means 具有更快的运行时间。
如果标准差/协方差矩阵大致相等,它们将产生相似的结果。如果您怀疑这是真的,请使用 k-means。
DBSCAN 用于非高斯数据。如果您使用一维数据,这通常不适用,因为高斯近似通常在一维中有效。
另一种简单的方法是基本上使用一维数组的排序:即遍历每个点并获取在正方向和负方向上与其最小距离的值。例如:
data = [1,2,3,4,5,6,7,8,9,10,12]
k = 5
for a in data:
print {'group': sorted(k, key=lambda n: abs(n-a))[0:k], 'point': a}
将给出:
{'group': [1, 2, 3, 4, 5], 'point': 1}
{'group': [2, 1, 3, 4, 5], 'point': 2}
{'group': [3, 2, 4, 1, 5], 'point': 3}
{'group': [4, 3, 5, 2, 6], 'point': 4}
{'group': [5, 4, 6, 3, 7], 'point': 5}
{'group': [6, 5, 7, 4, 8], 'point': 6}
{'group': [7, 6, 8, 5, 9], 'point': 7}
{'group': [8, 7, 9, 6, 10], 'point': 8}
{'group': [9, 8, 10, 7, 6], 'point': 9}
{'group': [10, 9, 8, 12, 7], 'point': 10}
{'group': [12, 10, 9, 8, 7], 'point': 12}
哪些点,即靠近特定点的项目基本上都在其组下。在这种技术中唯一需要考虑的是变量 k,它是集群的固定大小:-)。
如果只有一个变量,则不需要聚类。您可以轻松地根据变量的分布对观察结果进行分组。
还是我在这里遗漏了一些要点?