如何确保 k 中簇的质心意味着算法不会每次都切换?
How to ensure centroids of the clusters in k means algorithm doesn't switch everytime?
我有一个如下所示的 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 means 应用于 mse
值以获得 2 clusters
这给出我 2 centroids
一个用于 each.Now 我得到了一个 mse
值,我需要找到两个 centroids
中的哪一个是接近给定 mse
value.I 做这样的事情
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']
现在如您所见,我为每个集群分配了两个 centroid
值 153.27996598
和 19810.6925875
。
问题是它经常切换值 [(x,y) 或 (y,x)] 当你 运行 我的程序时得到最终结果 label1
或有时 label2
.
知道这是怎么回事吗fixed.Is有什么 sckit-learn 技术可以防止这种切换吗?
如@Vivek Kumar 所述,我需要传递一个附加参数 random_state
,同时设置 random_state
的 k means.The 值可以是任何整数。
kmeans = KMeans(n_clusters=2, random_state=1)
我有一个如下所示的 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 means 应用于 mse
值以获得 2 clusters
这给出我 2 centroids
一个用于 each.Now 我得到了一个 mse
值,我需要找到两个 centroids
中的哪一个是接近给定 mse
value.I 做这样的事情
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']
现在如您所见,我为每个集群分配了两个 centroid
值 153.27996598
和 19810.6925875
。
问题是它经常切换值 [(x,y) 或 (y,x)] 当你 运行 我的程序时得到最终结果 label1
或有时 label2
.
知道这是怎么回事吗fixed.Is有什么 sckit-learn 技术可以防止这种切换吗?
如@Vivek Kumar 所述,我需要传递一个附加参数 random_state
,同时设置 random_state
的 k means.The 值可以是任何整数。
kmeans = KMeans(n_clusters=2, random_state=1)