我注意到当使用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]]
这似乎太过浮点不精确。群集中心不是意味着什么,或者在这里发生了什么?
答案 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
希望它有所帮助。