python - 计算 k-means 的距离时环绕

标签 python machine-learning cluster-analysis classification

我正在尝试使用 sklearn 对某些数据集进行 K 均值聚类。问题是其中一个维度是一天中的小时数:一个从 0 到 23 的数字,因此距离算法认为 0 离 23 很远,因为从绝对意义上讲它是。实际上,出于我的目的,0 小时非常接近 23 小时。有没有办法让距离算法进行某种形式的环绕,以便计算更“真实”的时差。 我正在做一些简单的事情,类似于以下内容:

from sklearn.cluster import KMeans

clusters = KMeans(n_clusters = 2)
data = vstack(data)
fit = clusters.fit(data)
classes = fit.predict(data)

data 元素类似于 [22, 418, 192],其中第一个元素是小时。

有什么想法吗?

最佳答案

即使@elyase 的回答被接受,我认为这不是正确的方法。

是的,要使用这样的距离,您必须改进距离测量,因此 - 使用不同的库。但更重要的是 - k-means 中使用的 mean 概念不适合循环维度。让我们考虑以下示例:

#current cluster X,, based on centroid position Xc=24
x1=1
x2=24

#current cluster Y, based on centroid position Yc=10
y1=12
y2=13

计算简单的算术平均值会将质心置于Xc=12.5,Yc=12.5,从循环测量的角度来看是不正确的,应该是Xc=0.5,Yc=12.5。如您所见,基于循环距离度量的分配与简单的均值运算不“兼容”,并导致奇怪的结果。

  • 简单的 k-means 将产生聚类 {x1,y1}, {x2,y2}
  • 简单的 k--means + 距离测量导致退化的 super 集群 {x1,x2,y1,y2}
  • 正确的聚类应该是 {x1,x2},{y1,y2}

解决这个问题需要检查一个如果(是否更好地测量“简单平均”或将其中一个点表示为 x'=x-24)。不幸的是,给定 n 个点,它有 2^n 个可能性。

这似乎是核化 k-means 的一个用例,您实际上是在抽象特征空间中进行聚类(在您的例子中 - 一个围绕时间维度滚动的“管”)由内核(“相似性度量”,是某些向量空间的内积)。

给出了内核 k-means 的详细信息 here

关于python - 计算 k-means 的距离时环绕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18689427/

相关文章:

python - 值错误: could not convert string to float: 'lisans' in Python

Python 对文本文件中的数字进行平方

python - 如何检查变量是 lambda 函数

python - Tkinter - Canvas 并排问题

python - 使用 CouchDB 和 Python 的机器学习检测 'unusual behavior'?

python - Tensorflow:恢复模型后权重似乎是随机的

python - 在带有色调(分类变量)的pairgrid图上显示两个相关系数 - seaborn python

python - LinearSVC 无法使用均值差进行分类

matlab - 维诺图matlab

python - scikit-learn 中的 DBSCAN(仅限指标)