Python实现K-Means聚类算法比较:两种初始化聚类中心方法
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import random
import numpy as np
import matplotlib.pyplot as plt
# 读取Excel数据
data = pd.read_excel(r'D:\研究生作业\模式识别作业\2023年模式识别与机器学习数据集汇总1.xls')
# 提取四个特征
features = data[['身高(cm)', '体重(kg)', '50米成绩', '肺活量']]
# 提取男生和女生的数据
male_data = data[data['性别 男1女0'] == 1]
female_data = data[data['性别 男1女0'] == 0]
# 合并男生和女生的数据
merged_data = pd.concat([male_data, female_data])
# 标准化数据
scaler = StandardScaler()
scaled_data = scaler.fit_transform(features)
# 定义聚类数
num_clusters = 6
# 第一种方式:在特征最大值与最小值中间取6个随机聚类中心
random_centers = []
for i in range(num_clusters):
center = []
for j in range(scaled_data.shape[1]):
feature_min = np.min(scaled_data[:, j])
feature_max = np.max(scaled_data[:, j])
center.append(random.uniform(feature_min, feature_max))
random_centers.append(center)
random_centers = np.array(random_centers)
# 第二种方式:将特征值区间均分为6个子区间,取每个子区间的中值作为类中心
uniform_centers = []
for j in range(scaled_data.shape[1]):
feature_min = np.min(scaled_data[:, j])
feature_max = np.max(scaled_data[:, j])
interval = (feature_max - feature_min) / num_clusters
center = [feature_min + (i + 0.5) * interval for i in range(num_clusters)]
uniform_centers.append(center)
uniform_centers = np.array(uniform_centers).T
# 执行聚类并绘制二维分布图
fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(8, 12))
for i, centers in enumerate([random_centers, uniform_centers]):
kmeans = KMeans(n_clusters=num_clusters, init=centers, n_init=1, random_state=42)
kmeans.fit(scaled_data)
labels = kmeans.labels_
centers = kmeans.cluster_centers_
# 绘制二维分布图
axes[i].scatter(scaled_data[:, 0], scaled_data[:, 1], c=labels)
axes[i].scatter(centers[:, 0], centers[:, 1], marker='X', c='red')
axes[i].set_title(f'聚类初始值方法{i+1}的二维分布图')
axes[i].set_xlabel('标准化身高')
axes[i].set_ylabel('标准化体重')
plt.tight_layout()
plt.show()
# 将聚类中心还原回初始值
original_centers = scaler.inverse_transform(centers)
# 输出还原后的聚类中心
print(f'聚类初始值方法1的聚类中心(还原后):')
for center in original_centers:
print(f'身高: {center[0]:.2f}, 体重: {center[1]:.2f}, 50米成绩: {center[2]:.2f}, 肺活量: {center[3]:.2f}')
print()
# 输出还原后的聚类中心
print(f'聚类初始值方法2的聚类中心(还原后):')
for center in original_centers:
print(f'身高: {center[0]:.2f}, 体重: {center[1]:.2f}, 50米成绩: {center[2]:.2f}, 肺活量: {center[3]:.2f}')
原文地址: https://www.cveoy.top/t/topic/5xD 著作权归作者所有。请勿转载和采集!