k-means相似性分组
1.1k-means算法聚类
from sklearn.datasets import make_blobs
#创建高斯分布数据
X,y=make_blobs(n_samples=150,
n_features=2,
centers=3,
cluster_std=0.5,
shuffle=True,
random_state=0)
import matplotlib.pyplot as plt
plt.scatter(X[:,0],X[:,1],
c='blue',
marker='o',
edgecolors='black',
s=50)
plt.grid()
plt.show()
from sklearn.cluster import KMeans
km=KMeans(n_clusters=3,
init='random',
n_init=10,
max_iter=300,#max_iter太大,计算成本太高
tol=1e-04,
random_state=0)#tol参数控制集群内误差平方和的变化
y_km=km.fit_predict(X)#每个示例所属的集群的索引
当基于欧氏距离度量把k-均值算法应用到真实数据时,要确保特征度量的比例尺度一致,必要时可以用z-score标准化或最小最大化方法处理。
km.cluster_centers_
array([[ 0.9329651 , 4.35420712],
[ 2.06521743, 0.96137409],
[-1.5947298 , 2.92236966]])
y_km
array([1, 0, 0, 0, 1, 0, 0, 1, 2, 0, 1, 2, 2, 0, 0, 2, 2, 1, 2, 1, 0, 1,
0, 0, 2, 1, 1, 0, 2, 1, 2, 2, 2, 2, 0, 1, 1, 1, 0, 0, 2, 2, 0, 1,
1, 1, 2, 0, 2, 0, 1, 0, 0, 1, 1, 2, 0, 1, 2, 0, 2, 2, 2, 2, 0, 2,
0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 2, 2, 0, 1, 1, 0, 0, 1, 1, 1, 2,
2, 1, 1, 0, 1, 0, 1, 0, 2, 2, 1, 1, 1, 1, 2, 1, 1, 0, 2, 0, 0, 0,
2, 0, 1, 2, 0, 2, 0, 0, 2, 2, 0, 1, 0, 0, 1, 1, 2, 1, 2, 2, 2, 2,
1, 2, 2, 2, 0, 2, 1, 2, 0, 0, 1, 1, 2, 2, 2, 2, 1, 1])
#集群和质心画出
#画集群1
plt.scatter(X[y_km==0,0],
X[y_km==0,1],
s=50,
c='green',
marker='s',
edgecolors='black',
label='cluster 1')
#画集群2
plt.scatter(X[y_km==1,0],
X[y_km==1,1],
s=50,
c='orange',
marker='o',
edgecolors='black',
label='cluster 2')
#画集群3
plt.scatter(X[y_km==2,0],
X[y_km==2,1],
s=50,
c='blue',
marker='v',
edgecolors='black',
label='cluster 3')
#画质心
plt.scatter(km.cluster_centers_[:,0],
km.cluster_centers_[:,1],
s=250,
c='red',
marker='*',
edgecolors='black',
label='centeroids')
plt.legend(loc='best')
plt.grid()
plt.show()
1.2k-means++
要用scikit-learn的Kmeans对象的k-均值++,只需要把k-均值++的参数init设置成’k-means++'。
km1=KMeans(n_clusters=3,
init='k-means++',
n_init=10,
max_iter=300,#max_iter太大,计算成本太高
tol=1e-04,
random_state=0)#tol参数控制集群内误差平方和的变化
y_km=km1.fit_predict(X)#每个示例所属的集群的索引
#集群和质心画出
#画集群1
plt.scatter(X[y_km==0,0],
X[y_km==0,1],
s=50,
c='green',
marker='s',
edgecolors='black',
label='cluster 1')
#画集群2
plt.scatter(X[y_km==1