Python实现K-means聚类算法及可视化
Python实现K-means聚类算法及可视化
本篇博客介绍如何使用Python从零实现K-means聚类算法,并利用Matplotlib库将聚类结果可视化。
代码示例:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets
# kmeans聚类
class MyKmeans:
# k是聚类数,n是迭代次数
def __init__(self, k, n=20):
self.k = k
self.n = n
def fit(self, x, centers=None):
# 指定或随机选择k个点作为初始类中心
if centers is None:
idx = np.random.randint(low=0, high=len(x), size=self.k)
centers = x[idx]
inters = 0
while inters < self.n:
points_set = {key: [] for key in range(self.k)}
# 遍历所有的点p,将p放入最近的聚类中心的集合
for p in x:
nearest_index = np.argmin(np.sum((centers - p) ** 2, axis=1) ** 0.5)
points_set[nearest_index].append(p)
# 遍历每一个点集,计算新的类中心 每类的平均值
for i_k in range(self.k):
centers[i_k] = sum(points_set[i_k]) / len(points_set[i_k])
inters += 1
return points_set, centers
# 读取Excel数据
df = pd.read_csv('your_excel_file.csv')
data = df[['feature1', 'feature2']].values # 选择需要聚类的特征列
# 创建MyKmeans实例并进行训练
m = MyKmeans(3) # 设置聚类数为3
points_set, centers = m.fit(data)
# 可视化聚类结果
for ix, p in enumerate(centers):
plt.scatter(p[0], p[1], color='C{}'.format(ix), marker='d', edgecolor='black', s=256)
for i in range(len(points_set)):
data_i = np.asarray(points_set[i])
plt.scatter(data_i[:, 0], data_i[:, 1], color='C{}'.format(i))
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.title('K-means聚类结果')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.show()
代码说明:
- 导入库: 导入必要的库,包括NumPy用于数值计算,Matplotlib用于可视化,Pandas用于读取Excel数据。
- MyKmeans类: 定义一个名为
MyKmeans的类,实现K-means算法。__init__方法初始化聚类数k和迭代次数n。fit方法接收数据x和可选的初始中心点centers,执行K-means算法并返回最终的聚类结果和中心点。
- 读取Excel数据: 使用Pandas库的
read_csv函数读取Excel文件,并提取需要进行聚类的特征列数据。 - 创建MyKmeans实例并训练: 创建一个
MyKmeans类的实例,并调用fit方法对数据进行训练,得到聚类结果和中心点。 - 可视化聚类结果: 使用Matplotlib库绘制散点图,将不同类别的数据点用不同颜色区分,并标记出每个类别的中心点。
使用说明:
- 将代码中的
'your_excel_file.csv'替换为实际的Excel文件路径。 - 修改
data = df[['feature1', 'feature2']].values,选择需要进行聚类的特征列。 - 运行代码即可看到聚类结果的可视化图像。
总结:
本篇博客介绍了如何使用Python实现K-means算法,并通过Matplotlib库对聚类结果进行可视化。同时还介绍了如何读取Excel数据进行聚类分析,希望对大家有所帮助。
原文地址: https://www.cveoy.top/t/topic/f0iU 著作权归作者所有。请勿转载和采集!