0%

实验二扩展作业

无监督学习:kmeans聚类——选做

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import matplotlib.pyplot as plt  
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans

data = pd.read_csv('patient_data.csv') #加载病人数据集
X = data.drop(columns='PatientID') #将原始数据中的PatientID一列删除,因为这个特征对聚类没有帮助
X= X.dropna() #删除原数据中带有空缺值的样本
X= X[['Age','BMI']] #选取Age和BMI作为聚类特征
print(X.shape) #打印X矩阵的尺寸
print(X.head()) #打印X的前5行

# 绘制数据分布图
plt.scatter(X['Age'], X['BMI'], c="red", marker='o', label='patient') #以X矩阵的第一列为x坐标,X矩阵的第二列为y坐标,绘制散点图
plt.xlabel('Age') #设置x轴的标题
plt.ylabel('BMI') #设置y轴的标题
plt.legend(loc=2) #设置图例,loc=2,说明图例位置是左上角
plt.show() #显示散点图

estimator = KMeans(n_clusters=3) # 构造聚类器,n_clusters=3,说明目标类别数量为3
estimator.fit(X) # 聚类, 用数据X去得到具体的聚类器
label_pred = estimator.labels_ # 获取聚类标签,标签为0,1,2, 那么label_pred是一个150个元素的数列,对应每朵花所属的类别标签
# 绘制k-means结果
x0 = X[label_pred == 0] #把X中类别为0的花筛选出来,赋给x0类
x1 = X[label_pred == 1] #把X中类别为1的花筛选出来,赋给x1类
x2 = X[label_pred == 2] #把X中类别为2的花筛选出来,赋给x2类
plt.scatter(x0['Age'], x0['BMI'], c="red", marker='o', label='label0')
plt.scatter(x1['Age'], x1['BMI'], c="green", marker='*', label='label1')
plt.scatter(x2['Age'], x2['BMI'], c="blue", marker='+', label='label2')
plt.xlabel('Age')
plt.ylabel('BMI')
plt.legend(loc=2)
plt.show()