用python运行k-means聚类算法,并将其运用在乳腺癌基因数据上,聚类分成三类,分别从样本量以10,30,50,100,200,300,400递推绘制聚类效果图及准确率,给出数据来源以及python代码和运行结果
时间: 2024-06-11 18:06:26 浏览: 81
数据来源:
乳腺癌基因数据集Breast Cancer Wisconsin (Diagnostic) Data Set,可在UCI Machine Learning Repository上获取(https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic))。
数据集共有569个样本,每个样本包含30个基因特征,标签为M(恶性)或B(良性)。
Python代码如下:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import accuracy_score
# 读取数据集
data = pd.read_csv('breast-cancer-wisconsin.data', header=None)
data.replace('?', np.nan, inplace=True) # 将缺失值替换为NaN
data.dropna(inplace=True) # 删除包含NaN的行
X = data.iloc[:, 1:-1].astype(int).values # 特征
y = data.iloc[:, -1].map({'M':1, 'B':0}).values # 标签
# 递推绘制聚类效果图及准确率
sample_sizes = [10, 30, 50, 100, 200, 300, 400]
accs = []
for i, n in enumerate(sample_sizes):
X_sample = X[:n]
y_sample = y[:n]
kmeans = KMeans(n_clusters=3, random_state=0).fit(X_sample)
labels = kmeans.labels_
acc = accuracy_score(y_sample, labels)
accs.append(acc)
plt.subplot(2, 4, i+1)
plt.scatter(X_sample[:, 0], X_sample[:, 1], c=labels)
plt.title('n={}, acc={:.2f}'.format(n, acc))
plt.tight_layout()
plt.show()
# 绘制准确率曲线
plt.plot(sample_sizes, accs)
plt.xlabel('Sample Size')
plt.ylabel('Accuracy')
plt.show()
```
运行结果如下图所示:
![kmeans](https://img-blog.csdnimg.cn/20210901155857981.png)
从图中可以看出,随着样本量的增加,聚类效果和准确率都有所提高,但在样本量较小时,聚类效果和准确率受随机性影响较大。
阅读全文