sklearn 的 KMeans:聚类中心和聚类均值不同。数值不精确?
sklearn's KMeans: Cluster centers and cluster means differ. Numerical Imprecision?
我注意到当使用sklearn.cluster.KMeans从方法.cluster_centers_获取聚类时,聚类中心和每个聚类的手动计算方法似乎并没有给出准确的同样的答案。
对于小样本量,差异非常小,可能在 float 不精确范围内。但对于更大的样本:
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]]
对不同的样本大小做同样的事情:
这似乎是浮点不精确。聚类中心不是means,还是这是怎么回事?
我觉得可能跟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
希望对您有所帮助。
我注意到当使用sklearn.cluster.KMeans从方法.cluster_centers_获取聚类时,聚类中心和每个聚类的手动计算方法似乎并没有给出准确的同样的答案。
对于小样本量,差异非常小,可能在 float 不精确范围内。但对于更大的样本:
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]]
对不同的样本大小做同样的事情:
这似乎是浮点不精确。聚类中心不是means,还是这是怎么回事?
我觉得可能跟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
希望对您有所帮助。