如何在sklearn新版kmeans中使用预计算的距离矩阵?

问题描述 投票:0回答:1

我正在计算我自己的距离矩阵,如下所示,我想用它来进行聚类。

import numpy as np
from math import pi

#points containing time value in minutes
points = [100, 200, 600, 659, 700]

def convert_to_radian(x):
    return((x / (24 * 60)) * 2 * pi)

rad_function = np.vectorize(convert_to_radian)
points_rad = rad_function(points)

#generate distance matrix from each point
dist = points_rad[None,:] - points_rad[:, None]

#Assign shortest distances from each point
dist[((dist > pi) & (dist <= (2*pi)))] = dist[((dist > pi) & (dist <= (2*pi)))] -(2*pi)
dist[((dist > (-2*pi)) & (dist <= (-1*pi)))] = dist[((dist > (-2*pi)) & (dist <= (-1*pi)))] + (2*pi) 
dist = abs(dist)

#check dist
print(dist)

我的距离矩阵如下。

[[0.         0.43633231 2.18166156 2.43909763 2.61799388]
 [0.43633231 0.         1.74532925 2.00276532 2.18166156]
 [2.18166156 1.74532925 0.         0.25743606 0.43633231]
 [2.43909763 2.00276532 0.25743606 0.         0.17889625]
 [2.61799388 2.18166156 0.43633231 0.17889625 0.        ]]

我想用kmeans对上述预先计算的距离矩阵进行2个聚类(例如,聚类1:0,1,聚类2:2,3,4)。

当我查看kmeans文档时,发现好像预计算的距离已经被废弃了-> precompute_distances='deprecated'.

链接到文档。https:/scikit-learn.orgstablemodulesgeneratedsklearn.cluster.KMeans.html。

我想知道还有什么其他的选择,我可以研究使用我的预计算距离矩阵来执行kmeans。

如果需要的话,我很乐意提供更多细节。

python scikit-learn k-means
1个回答
1
投票

你是否 真的 如果你想使用你自己的距离矩阵进行聚类,如果你最终要把结果反馈给sklearn?如果不想,那么你可以直接在你的数据集上使用KMeans,将你的积分矩阵重塑为一个 (-1, 1) 数组(numpy使用 -1 作为一种填充物来返回原轴长度的重塑)


import numpy as np
from math import pi
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

#points containing time value in minutes
points = [100, 200, 600, 659, 700]

def convert_to_radian(x):
    return((x / (24 * 60)) * 2 * pi)

rad_function = np.vectorize(convert_to_radian)
points_rad = rad_function(points)

lbls = KMeans(n_clusters=2).fit_predict(points_rad.reshape((-1,1)))
print(lbls) # prints the following: [0 0 1 1 1]

fig, ax = plt.subplots()

ax.scatter(points_rad, points_rad, c=lbls)

plt.show()

[![enter image description here][1]][1]


  [1]: https://i.stack.imgur.com/RTC5k.png

1
投票

kMeans需要的是聚类中心点("平均值")的距离(在每次迭代时),而不是点之间的对偶距离。 因此,与k-最近邻不同,预先计算这些数据不会有任何帮助*。 这里被废弃的参数的含义是 precompute_distances 而是先计算所有的点中心距离,还是圈内计算;详见 PR11950. 该PR对性能进行了提升,避免了对这个参数的需求。

* 好吧,我可以看到,如果把数据放到一个像 BallTree 这样的搜索结构中(同样参见 k-neighbors),这样就不需要计算所有的点-中心点距离,也许会有一个加速;但不清楚这有多大的帮助,而且我想只有当 k 很大的时候才会真正有用。 无论如何,这里没有这样做。

© www.soinside.com 2019 - 2024. All rights reserved.