以下是使用 Python 代码实现对男生女生样本数据进行 C-均值聚类分析,并分析不同初始聚类中心对结果的影响。代码首先读取 Excel 表格中的数据,并提取男生和女生的样本数据。然后,对身高、体重、50米成绩、肺活量四个特征进行标准化处理。接下来,使用两种不同的方式选择初始聚类中心进行聚类分析,并绘制出对应的二维分布图。最后,输出还原后的聚类中心,聚类中心表示为身高、体重、50米成绩和肺活量四个特征的值。

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')

# 提取男生和女生的数据
male_data = data[data['性别'] == '男']
female_data = data[data['性别'] == '女']

# 合并男生和女生的数据
merged_data = pd.concat([male_data, female_data])

# 提取身高、体重、50米成绩、肺活量四个特征
features = ['身高', '体重', '50米成绩', '肺活量']

# 标准化数据
scaler = StandardScaler()
scaled_data = scaler.fit_transform(merged_data[features])

# 定义聚类数
num_clusters = 10

# 第一种方式:在特征最大值与最小值中间取 10 个随机聚类中心
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)

# 第二种方式:将特征值区间均分为 10 个子区间,取每个子区间的中值作为类中心
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]}, 体重: {center[1]}, 50米成绩: {center[2]}, 肺活量: {center[3]}')
print()

# 输出还原后的聚类中心
print(f'聚类初始值方法2的聚类中心(还原后):')
for center in original_centers:
    print(f'身高: {center[0]}, 体重: {center[1]}, 50米成绩: {center[2]}, 肺活量: {center[3]}')

请确保您已安装 pandas、scikit-learn 和 matplotlib 库。此代码将读取指定路径的 Excel 文件,并提取其中的男生和女生的数据。然后,它使用 C-均值聚类算法对经过标准化的身高、体重、50米成绩和肺活量四个特征进行聚类分析。代码将首先通过随机方式和均分子区间的方式选择初始聚类中心进行聚类,并分别绘制出对应的二维分布图。同时,代码使用 scaler.inverse_transform() 将标准化后的聚类中心还原回初始值。最后,代码输出聚类中心,其中聚类中心表示为身高、体重、50米成绩和肺活量四个特征的值。


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

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