如何确保k中簇的质心意味着算法不会每次都切换?

时间:2018-05-02 09:41:42

标签: python-3.x pandas scikit-learn k-means

我有一个csv文件,如下所示

date                       mse                                                  
2018-02-11                 14.34
2018-02-12                 7.24
2018-02-13                 244.5
2018-02-14                 3.5
2018-02-16                 12.67
2018-02-21                 45.66
2018-02-22                 15.33
2018-02-24                 98.44
2018-02-26                 23.55
2018-02-27                 45.12
2018-02-28                 78.44
2018-03-01                 34.11
2018-03-05                 23.33
2018-03-06                 127.45
...                        ...   
...                        ...

现在我尝试将 k表示应用于mse值,以获得 2 clusters,这使我 2 centroids每个一个。现在我获得mse值,我需要找到两个centroids中哪一个更接近给定的mse值。我做像这样的东西

from sklearn.cluster import KMeans
import pandas as pd

centroid_list = []
given_mse = 7.382409087
kmeans = KMeans(n_clusters=2)
df = pd.read_csv("data.csv", parse_dates=["date"])
kmeans.fit_predict(df[['mse']])
centroid_list.append(kmeans.cluster_centers_.ravel())
#print(centroids_list)  # array([  153.27996598, 19810.6925875 ]
for i in centroids_list:
t1 = abs(given_mse - i[0])
t2 = abs(given_mse - i[1])
if t1 < t2:
   result.append("label 1")
   else:
   result.append("label 2")
print(result)  # ['label1']

现在您可以看到我为每个群集分配了两个centroid153.2799659819810.6925875

问题是,当你运行程序时,它会不断地将值切换为 [(x,y)或(y,x)] ,因此我得到的最终结果为{{1或者有时label1

知道如何解决这个问题。是否有任何sckit-learn技术可以防止这种转换?

1 个答案:

答案 0 :(得分:0)

如@Vivek Kumar所述,我需要在设置k均值时传递一个额外的参数random_staterandom_state的值可以是任何整数。

kmeans = KMeans(n_clusters=2, random_state=1)