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}')
Python实现K-Means聚类算法比较:两种初始化聚类中心方法

原文地址: https://www.cveoy.top/t/topic/5xD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录