sklearn的KMeans:集群中心和集群方式不同。数值不精确?

时间:2018-03-09 11:04:04

标签: python scikit-learn k-means

我注意到当使用sklearn.cluster.KMeans获取群集时,群集中心,从方法.cluster_centers_和手动为每个群集计算意味着似乎给出完全相同的答案

对于小样本量,差异非常小,可能在浮动不精确的范围内。但对于较大的样本:

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans

np.random.seed(0)
x = np.random.normal(size=5000)
x_z = (x - x.mean() / x.std()).reshape(5000,1)
cluster=KMeans(n_clusters=2).fit(x_z)

df = pd.DataFrame(x_z)
df['label'] =  cluster.labels_

difference = np.abs(df.groupby('label').mean() - cluster.cluster_centers_)
print(difference)

[[0.00217333] [0.00223798]]

针对不同的样本量做同样的事情:enter image description here

这似乎太过浮点不精确。群集中心不是意味着什么,或者在这里发生了什么?

1 个答案:

答案 0 :(得分:3)

我认为这可能与KMeans的容忍度有关。默认值为1e-4,因此设置较低的值即tol=1e-8会给出:

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans

np.random.seed(0)
x = np.random.normal(size=5000)
x_z = (x - x.mean() / x.std()).reshape(5000,1)
cluster=KMeans(n_clusters=2, tol=1e-8).fit(x_z)

df = pd.DataFrame(x_z)
df['label'] =  cluster.labels_

difference = np.abs(df.groupby('label').mean() - cluster.cluster_centers_)
print(difference)

                    0
label                
0      9.99200722e-16
1      1.11022302e-16

希望它有所帮助。