K-Means聚类分析以及差错平方和SSE(Python完成)
K-means聚类的原理。
K-Means算法的方针是将原始数据分为K簇,每一簇都有一个中心点,这也是簇中点的均值点,簇中所有的点到所属的簇的中心点的间隔都比到其他簇的中心点更近。
K-means聚类的算法流程。
1、随机确认K个点作为质心。
2、找到离每个点最近的质心,将这个点分配到这个质心代表的簇里。
3、再对每个簇进行核算,以点簇的均值点作为新的质心。
4、假如新的质心和上一轮的不一样,则迭代进行2-3过程,直到质心方位安稳。
代码介绍
运用 make_blobs 函数生成一个二维的随机数据集,包括120个样本和3个中心。生成的数据将用于后续的聚类剖析。
数据生成后,经过散点图可视化这些点,展现不同的聚类中心。
界说了一个函数 calculate_sse,用于核算给定聚类数 k 时的差错平方和(SSE)。该函数运用K-Means算法进行聚类,并回来聚类后的SSE值。
# 导入必要的库
import numpy as np # 用于数值核算
import matplotlib.pyplot as plt # 用于数据可视化
from sklearn.datasets import make_blobs # 用于生成聚类数据
from sklearn.cluster import KMeans # 用于K-Means聚类算法
# 1. 生成数据
X, y_true = make_blobs(n_samples=120, n_features=2, centers=3, random_state=42) # 生成120个样本,2个特征,3个聚类中心
# 可视化生成的数据
# 设置matplotlib的字体为中文和负号的显现
plt.rcParams["font.sans-serif"] = ["SimHei"] # 使绘图时中文正确显现
plt.rcParams["axes.unicode_minus"] = False # 使绘图时负号正确显现
plt.scatter(X[:, 0], X[:, 1], s=30) # 制作散点图
plt.title("初始数据") # 图表标题
plt.xlabel("特征 1") # x轴标签
plt.ylabel("特征 2") # y轴标签
plt.show() # 显现图形
# 2. 界说核算SSE的函数
def calculate_sse(X, k):
kmeans = KMeans(n_clusters=k, random_state=42) # 初始化K-Means算法,指定聚类数量k
kmeans.fit(X) # 进行聚类
sse = kmeans.inertia_ # 获取聚类的差错平方和(SSE)
return sse # 回来SSE值
# 3. 履行聚类并记载SSE
sse_list = [] # 初始化一个列表用于存储不同K值的SSE
k_values = range(1, 11) # 界说K的规模,从1到10
n_trials = 5 # 每个K值进行5次试验以下降随机性影响
for k in k_values: # 遍历每一个K值
sse_trials = [] # 记载每个K值的SSE试验成果
for _ in range(n_trials): # 进行n_trials次试验
sse = calculate_sse(X, k) # 核算当时K值下的SSE
sse_trials.append(sse) # 将成果保存到列表
avg_sse = np.mean(sse_trials) # 核算当时K值的均匀SSE
sse_list.append(avg_sse) # 将均匀SSE保存到sse_list中
# 4. 输出K值与均匀SSE联系数据
print("K值与均匀SSE联系:") # 打印阐明
for k, sse in zip(k_values, sse_list): # 遍历K值及其对应的均匀SSE
print(f"K = {k}, 均匀 SSE = {sse:.2f}") # 格式化输出K值及其对应的均匀SSE
# 将输出保存到文件
with open("sse_results.txt", "w") as file: # 翻开文件以写入
file.write("K值与均匀SSE联系:\n") # 写入文件标题
for k, sse in zip(k_values, sse_list): # 遍历K值及其对应的均匀SSE
file.write(f"K = {k}, 均匀 SSE = {sse:.2f}\n") # 保存K值和均匀SSE到文件中
print("SSE数据已保存到 sse_results.txt 文件中") # 输出保存成功的提示信息
# 5. 制作K值与均匀SSE联系图
plt.plot(k_values, sse_list, marker='o') # 制作K值与均匀SSE的折线图,并运用圆点符号
plt.title("均匀SSE vs 簇数量(K)") # 图表标题
plt.xlabel("簇个数(K)") # x轴标签
plt.ylabel("均匀 SSE") # y轴标签
plt.xticks(k_values) # 设置x轴刻度
plt.grid() # 添加网格
plt.show() # 显现图形
# 6. 运用最佳K值从头进行聚类并可视化成果
best_k = 3 # 假定最优的K值为3
kmeans = KMeans(n_clusters=best_k, random_state=42) # 初始化K-Means算法
y_kmeans = kmeans.fit_predict(X) # 进行聚类并回来每个样本的聚类标签
# 可视化聚类成果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=30, cmap='viridis') # 制作聚类成果的散点图,色彩代表不同聚类
centers = kmeans.cluster_centers_ # 获取聚类中心
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X') # 制作聚类中心
plt.title(f"K={best_k}的K- means聚类") # 图表标题
plt.xlabel("特征 1") # x轴标签
plt.ylabel("特征 2") # y轴标签
plt.show() # 显现聚类成果图
运转成果:
为了确认最佳的聚类数量K,代码核算从1到10的不同K值对应的均匀SSE。每个K值重复进行5次试验,以削减随机性对成果的影响。
核算好的均匀SSE值被存储在一个列表中,并终究输出至控制台以显现K值与SSE的联系。
将K值与均匀SSE的联系写入到一个文本文件中,便利后续检查和剖析。
运用折线图将K值与对应的均匀SSE可视化,直观展现聚类数量对聚类作用的影响。
由左至右k=1,2,3,4,5,6,7,SSE会跟着K的变大而减小。能够看出在k= 3之后,跟着k的增大,SSE的下降减缓了,再添加K得到的聚合报答变小,也便是k=3应该为最佳聚类数。
结合其他k值的图画,当K=2时,数据点的分类其实是不充分的。而当K=4时,数据点上方非常密布的数据点却常常由于右上角噪音点的影响被从中心分红两簇,这是不符合实际情况的,当k>3时,聚类成果就会显得更加凌乱。结合图画,K=3仍然是最好的挑选。
由图得出最佳的K值为3,从头运用K-Means算法进行聚类,并可视化聚类成果。每个聚类用不同的色彩符号,而且制作出聚类中心,以便明晰了解聚类的作用。