数据挖掘-实验-聚类


首先我们随机创建一些二维数据作为训练集,选择二维特征数据,主要是方便可视化。代码如下:

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs

X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=9)

plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.show()

现在我们来用K-Means聚类方法来做聚类,首先选择k=2,代码如下:

1
2
3
4
from sklearn.cluster import KMeans
y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

然后我们用Calinski-Harabasz Index来评估聚类的效果,这个值的得分越高越好。 (请记录下面每一次更改k值后Calinski-Harabasz Index的值),从而来判定当k选取多少的时候,聚类效果最好

1
2
from sklearn import metrics
print("k=2时,聚类效果得分:",metrics.calinski_harabasz_score(X, y_pred))

接下来让k=3,代码如下:

1
2
3
4
y_pred = KMeans(n_clusters=3, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
print("k=3时,聚类效果得分:",metrics.calinski_harabasz_score(X, y_pred))

运行后会画出下面的图

接下来让k=4,代码如下:

1
2
3
4
y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
print("k=4时,聚类效果得分:",metrics.calinski_harabasz_score(X, y_pred))

运行后会画出下面的图

最后,运行下面的代码,看一下总的效果图:

1
2
3
4
5
6
7
8
9
from sklearn.cluster import MiniBatchKMeans
for index, k in enumerate((2, 3, 4)):
plt.subplot(2, 2, index + 1)
y_pred = MiniBatchKMeans(n_clusters=k, batch_size=200, random_state=9).fit_predict(X)
score = metrics.calinski_harabasz_score(X, y_pred)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.text(.99, .01, ('k=%d, score: %.2f' % (k, score)), transform=plt.gca().transAxes, size=10,
horizontalalignment='right')
plt.show()

运行后会输出下面的画面