ML之K-means:基于DIY數(shù)據(jù)集利用K-means算法聚類(測(cè)試9種不同聚類中心的模型性能)
輸出結(jié)果
設(shè)計(jì)思路
- 1,、使用均勻分布函數(shù)隨機(jī)三個(gè)簇,每個(gè)簇周圍10個(gè)數(shù)據(jù)樣本。
- 2,、繪制30個(gè)數(shù)據(jù)樣本的分布圖像,。
- 3,、測(cè)試9種不同聚類中心數(shù)量下,每種情況的聚類質(zhì)量,并作圖,。
實(shí)現(xiàn)代碼
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
#1,、使用均勻分布函數(shù)隨機(jī)三個(gè)簇,每個(gè)簇周圍10個(gè)數(shù)據(jù)樣本。
cluster1 = np.random.uniform(0.5, 1.5, (2, 10))
cluster2 = np.random.uniform(5.5, 6.5, (2, 10))
cluster3 = np.random.uniform(3.0, 4.0, (2, 10))
#2,、繪制30個(gè)數(shù)據(jù)樣本的分布圖像,。
X = np.hstack((cluster1, cluster2, cluster3)).T
plt.scatter(X[:,0], X[:, 1])
plt.xlabel('x1')
plt.ylabel('x2')
plt.title('DIY data:30, Random 3 clusters(10 data samples around each cluster)')
plt.show()
#3、測(cè)試9種不同聚類中心數(shù)量下,每種情況的聚類質(zhì)量,并作圖,。
K = range(1, 10)
meandistortions = []
for k in K:
kmeans = KMeans(n_clusters=k)
kmeans.fit(X)
meandistortions.append(sum(np.min(cdist(X, kmeans.cluster_centers_, 'euclidean'), axis=1))/X.shape[0])
plt.plot(K, meandistortions, 'bx-')
plt.xlabel('k')
plt.ylabel('Average Dispersion')
plt.title('K-means: Selecting k with the Elbow Method')
plt.show()