Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在sklearn的新版本kmeans中使用预计算的距离矩阵?_Python_Scikit Learn_K Means - Fatal编程技术网

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

Python 如何在sklearn的新版本kmeans中使用预计算的距离矩阵?,python,scikit-learn,k-means,Python,Scikit Learn,K Means,我正在计算我自己的距离矩阵,如下所示,我想用它进行聚类 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_ra

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

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)
我希望使用kmeans为上述预计算的距离矩阵创建两个集群(例如,集群1:0,1和集群2:2,3,4)

当我查看kmeans文档时,似乎预计算距离已被弃用->
precompute\u distance='deprecated'

链接到文档:

我想知道我还可以考虑哪些其他选项来使用预计算的距离矩阵执行kmeans


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

kMeans需要到簇的质心(“平均值”)的距离(在每次迭代中),而不是点之间的成对距离。因此,与k近邻不同,预先计算这些数据不会有帮助*。此处不推荐使用的参数
precompute_distance
的含义是首先计算所有点中心距离,还是在循环中计算;有关详细信息,请参阅。该PR进行了性能增强,消除了对该参数的需要


*嗯,我可以看到,如果将数据放入一个类似BallTree的搜索结构中(再次参见k-邻域),可能会有一个加速,这样就不需要计算所有的点形心距离;但目前还不清楚这能起到多大的作用,我认为只有当k相当大时,它才会真正有用。无论如何,这里没有这样做。

kMeans需要到簇的质心(“平均值”)的距离(在每次迭代中),而不是点之间的成对距离。因此,与k近邻不同,预先计算这些数据不会有帮助*。此处不推荐使用的参数
precompute_distance
的含义是首先计算所有点中心距离,还是在循环中计算;有关详细信息,请参阅。该PR进行了性能增强,消除了对该参数的需要

*嗯,我可以看到,如果将数据放入一个类似BallTree的搜索结构中(再次参见k-邻域),可能会有一个加速,这样就不需要计算所有的点形心距离;但目前还不清楚这能起到多大的作用,我认为只有当k相当大时,它才会真正有用。无论如何,这里没有这样做。

如果最终要将结果反馈给sklearn,您真的想使用自己的距离矩阵进行聚类吗?如果没有,则可以通过将点矩阵重塑为
(-1,1)
数组(numpy使用
-1
作为一种填充,以返回原始轴长度的重塑,直接在数据集上使用KMeans)

如果最终要将结果反馈给sklearn,您真的想使用自己的距离矩阵进行聚类吗?如果没有,则可以通过将点矩阵重塑为
(-1,1)
数组(numpy使用
-1
作为一种填充,以返回原始轴长度的重塑,直接在数据集上使用KMeans)

[[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.        ]]

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