机器学习_6、k_means

from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np

X, _ = make_blobs(n_samples=200,n_features=2,centers=3,
                 cluster_std=[0.6,1.2,2], random_state=0)

#用make_blobs函数生成测试数据集,n_features表示每一个样本有多少特征值,
# n_samples表示样本的个数,centers是聚类中心点的个数,即label的种类数
# random_state是随机种子,可以固定生成的数据,cluster_std设置每个类别的方差
plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文
plt.rcParams['axes.unicode_minus']=False   #正常显示负号
plt.rcParams.update({"font.size":15})
plt.figure(figsize=(13,13))
plt.subplot(2,2,1)
plt.gca()
# 用图形显示数据点的分布
plt.scatter(X[:,0],X[:,1],s=50)
plt.title("原始数据")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.grid()

# 用传统k-均值算法聚类
cluster = KMeans(n_clusters=3, init="random",random_state=0)
cluster.fit(X)
# label_属性中保存了各样本的聚类标签
print("前10个样本的聚类标签:", cluster.labels_[:10])
# predict()方法返回各样本对应的预测聚类标签,可用于新样本的预测
y_predict = cluster.predict(X) 
print("前10个样本的聚类标签:", y_predict[:10])
# cluster_centers_属性保存了各个簇中心
print("传统k-均值聚类的簇中心:\n",cluster.cluster_centers_, sep="")

markers = ("s","o","v","+")
colors = ("y","g","b","k")
#plt.figure()
plt.subplot(2,2,2)
plt.gca()
# 显示簇元素
for i in np.unique(cluster.labels_):
    plt.scatter(X[cluster.labels_==i, 0],
                X[cluster.labels_==i, 1],
                c=colors[i], s=50, marker=markers[i],
                label="簇标签-"+str(i))
# 显示簇中心
plt.scatter(cluster.cluster_centers_[:,0],
            cluster.cluster_centers_[:,1],
            marker="*", s=180, c="r", label="簇中心")
            
plt.title("传统k-均值聚类结果")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.legend()
plt.grid()

#确定K值,利用手肘法确定K值,计算算法在不同k值下的SSE,以图形化的方式显示
# 曲线中拐点最大的位置对应的K是最佳的聚类数量
SSE = []  # 存放每次结果的误差平方和
for k in range(1,9):
    estimator = KMeans(n_clusters=k)  # 构造聚类器
    estimator.fit(X)
    SSE.append(estimator.inertia_) # estimator.inertia_获取聚类准则的总和
X = range(1,9)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X,SSE,'o-')
plt.show()



# 用k-均值++算法聚类
cluster = KMeans(n_clusters=3, init="k-means++",random_state=0)
cluster.fit(X)
#plt.figure()
plt.subplot(2,2,3)
plt.gca()
# 显示簇元素
for i in np.unique(cluster.labels_):
    plt.scatter(X[cluster.labels_==i, 0],
                X[cluster.labels_==i, 1],
                c=colors[i], s=50, marker=markers[i],
                label="簇标签-"+str(i))
# 显示簇中心
plt.scatter(cluster.cluster_centers_[:,0],
            cluster.cluster_centers_[:,1],
            marker="*", s=180, c="r", label="簇中心")
            
plt.title("k-均值++聚类结果")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.legend()
plt.grid()
#调整子图行间距和列间距
plt.subplots_adjust(hspace=0.35,wspace=0.2)   
plt.savefig("k_means.png")
plt.show()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知源书院

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值