#!python3
#-*- coding: utf-8 -*-
# 2018/7/6 0006 14:29
# kmean与mini batch kmeans 算法的比较
import time
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors
from sklearn.cluster import KMeans, MiniBatchKMeans
from sklearn.datasets.samples_generator import make_blobs
from sklearn.metrics.pairwise import pairwise_distances_argmin
from sklearn import metrics
from sklearn.metrics.pairwise import pairwise_distances_argmin
from sklearn.datasets.samples_generator import make_blobs
# 解决中文显示问题
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
# 初始化三个中心
centers = [[1, 1], [-1, -1], [1, -1]]
clusters = len(centers) # 聚类数目为3
# 产生3000组二维数据样本,三个中心点,标准差是0.7
X, Y = make_blobs(n_samples=100000, n_features = 20, centers=centers, cluster_std=0.7, random_state=28)#make_blobs 返回X 样本数据集 ,Y 样本数据集的标签
#有差异图:20W 2V 崩
# 构建kmeans算法
k_means = KMeans(init="k-means++", n_clusters=clusters, random_state=28)
t0 = time.time()
k_means.fit(X) # 模型训练
km_batch = time.time() - t0 # 使用kmeans训练数据消耗的时间
print("K-Means算法模型训练消耗时间:%.4fs" % km_batch)
# 构建mini batch kmeans算法
batch_size = 1000 # 采样集的大小
mbk = MiniBatchKMeans(init="k-means++", n_clusters=clusters, batch_size=batch_size, random_state=28)
t0 = time.time()
mbk.fit(X)
mbk_batch = time.time() - t0
print("Mini Batch K-Means算法模型训练消耗时间:%.4fs" % mbk_batch)
# 预测结果
km_y_hat = k_means.predict(X)
mbk_y_hat = mbk.predict(X)
# 获取聚类中心点并对其排序
k_means_cluster_center = k_means.cluster_centers_
mbk_cluster_center = mbk.cluster_centers_
print("K-Means算法聚类中心点:\n center=", k_means_cluster_center)
print("Mini Batch K-Means算法聚类中心点:\n center=", mbk_cluster_center)
order = pairwise_distances_argmin(k_means_cluster_center, mbk_cluster_center)
km_y_hat = k_means.labels_
mbkm_y_hat = mbk.labels_
# 效果评估
### 效果评估
score_funcs = [
metrics.adjusted_rand_score, # ARI(调整兰德指数)
metrics.v_measure_score, # 均一性与完整性的加权平均
metrics.adjusted_mutual_info_score, # AMI(调整互信息)
metrics.mutual_info_score, # 互信息
]
## 2. 迭代对每个评估函数进行评估操作
for score_func in score_funcs:
t0 = time.time()
km_scores = score_func(Y, km_y_hat)
print("K-Means算法:%s评估函数计算结果值:%.5f;计算消耗时间:%0.3fs" % (score_func.__name__, km_scores, time.time() - t0))
t0 = time.time()
mbkm_scores = score_func(Y, mbkm_y_hat)
print(
"Mini Batch K-Means算法:%s评估函数计算结果值:%.5f;计算消耗时间:%0.3fs\n" % (score_func.__name__, mbkm_scores, time.time() - t0))
# 画图
plt.figure(figsize=(12, 6), facecolor="w")
plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.9)
cm = mpl.colors.ListedColormap(['#FFC2CC', '#C2FFCC', '#CCC2FF'])
cm2 = mpl.colors.ListedColormap(['#FF0000', '#00FF00', '#0000FF'])
# 子图1——原始数据
plt.subplot(221)
plt.scatter(X[:, 0], X[:, 1], c=Y, s=6, cmap=cm, edgecolors="none")
plt.title(u"原始数据分布图")
plt.xticks(())
plt.yticks(())
plt.grid(True)
# 子图2:K-Means算法聚类结果图
plt.subplot(222)
plt.scatter(X[:, 0], X[:, 1], c=km_y_hat, s=6, cmap=cm, edgecolors='none') #聚类分类颜色
plt.scatter(k_means_cluster_center[:, 0], k_means_cluster_center[:, 1], c=range(clusters), s=60, cmap=cm2,
edgecolors='none') #聚类中心点颜色
plt.title(u'K-Means算法聚类结果图')
plt.xticks(())
plt.yticks(())
plt.text(-3.8, 3, 'train time: %.2fms' % (km_batch * 1000))
plt.grid(True)
# 子图3:Mini Batch K-Means算法聚类结果图
plt.subplot(223)
plt.scatter(X[:, 0], X[:, 1], c=mbk_y_hat, s=6, cmap=cm, edgecolors='none')
plt.scatter(mbk_cluster_center[:, 0], mbk_cluster_center[:, 1], c=range(clusters), s=60, cmap=cm2, edgecolors='none')
plt.title(u'Mini Batch K-Means算法聚类结果图')
plt.xticks(())
plt.yticks(())
plt.text(-3.8, 3, 'train time: %.2fms' % (mbk_batch * 1000))
plt.grid(True)
# 子图4:MKB KM 比较差异图
# k_means_labels = pairwise_distances_argmin(X, k_means_cluster_center)
# mbk_means_labels = pairwise_distances_argmin(X, mbk_cluster_center)
# order = pairwise_distances_argmin(k_means_cluster_center,mbk_cluster_center)
#
# different = (mbk_means_labels == 4)
# ax = plt.subplot(224) # add_subplot 图像分给为 一行三列,第三块
#
# for k in range(clusters):
# different += ((k_means_labels == k) != (mbk_means_labels == order[k]))
#
# identic = np.logical_not(different)
# ax.plot(X[identic, 0], X[identic, 1], 'w',
# markerfacecolor='#bbbbbb', marker='.')
# ax.plot(X[different, 0], X[different, 1], 'w',
# markerfacecolor='m', marker='.')
# ax.set_title('Difference')
# ax.set_xticks(())
# ax.set_yticks(())
plt.savefig("kmean与mini batch kmeans 算法的比较.png")
plt.show()
评论0