代码实现:读入 PCA 降维后的二维鸢尾花数据集,不用调库的方式而是按 Kmeans 算法描述的过程完成数据集的聚类处理(取 K=2)(注意: 不得直接调用 sklearn 或其他库中的 Kmeans 或类似的类和函数),并输出聚类 结果(各样本的所属簇编号,以及各簇的聚类中心向量)调用 matplotlib 的 scatter 函数将聚类后各样本以及聚类中心的可视化 输出(不同簇内的样本用不同的颜色表示)。调 用 sklearn 库 中 的 rand_score 、 fowlkes_mallows_score 、 davies_bouldin_score 函数,计算得到外部指标(RI、FMI)和内部指标(DBI),寻找最佳聚类数 K。取 K=2~8 分别进行 Kmeans 聚类,并计算每种 K 取值时的 DBI 指标(也可以采用轮廓分数),画出折线图,并找出最佳 K 值。
时间: 2024-03-13 20:46:30 浏览: 87
好的,以下是一个Python代码实现,可以完成您的要求。代码中使用了numpy和matplotlib库,但没有直接调用sklearn或其他库中的Kmeans或类似的类和函数。
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import rand_score, fowlkes_mallows_score, davies_bouldin_score
# 读入PCA降维后的二维鸢尾花数据集
data = np.loadtxt('iris_pca.txt', delimiter=',')
# 设置聚类数K为2
K = 2
# 初始化聚类中心向量,随机选择K个样本作为中心
np.random.seed(42) # 设置随机种子,以便复现结果
centers = data[np.random.choice(data.shape[0], K, replace=False), :]
print('初始化聚类中心向量:\n', centers)
# 迭代进行Kmeans算法,最多迭代100次
max_iter = 100
for i in range(max_iter):
# 分配样本到最近的聚类中心
distances = np.linalg.norm(data[:, np.newaxis, :] - centers, axis=2) # 计算样本到聚类中心的距离
labels = np.argmin(distances, axis=1) # 分配样本到最近的聚类中心
# 更新聚类中心向量
new_centers = np.array([data[labels == k, :].mean(axis=0) for k in range(K)])
# 如果聚类中心不再发生变化,停止迭代
if np.allclose(new_centers, centers):
break
centers = new_centers
# 输出聚类结果
print('聚类结果:\n', labels)
print('聚类中心向量:\n', centers)
# 可视化聚类结果
colors = ['r', 'b']
for k in range(K):
plt.scatter(data[labels == k, 0], data[labels == k, 1], c=colors[k])
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=100, c='k')
plt.title('Kmeans Clustering Result')
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.show()
# 计算外部指标
true_labels = np.loadtxt('iris_labels.txt', dtype=int)
ri = rand_score(true_labels, labels)
fmi = fowlkes_mallows_score(true_labels, labels)
print('Rand Index: %.4f' % ri)
print('Fowlkes-Mallows Index: %.4f' % fmi)
# 计算内部指标,寻找最佳聚类数K
Ks = range(2, 9)
dbis = []
for k in Ks:
# 进行Kmeans聚类
centers = data[np.random.choice(data.shape[0], k, replace=False), :]
for i in range(max_iter):
# 分配样本到最近的聚类中心
distances = np.linalg.norm(data[:, np.newaxis, :] - centers, axis=2)
labels = np.argmin(distances, axis=1)
# 更新聚类中心向量
new_centers = np.array([data[labels == j, :].mean(axis=0) for j in range(k)])
# 如果聚类中心不再发生变化,停止迭代
if np.allclose(new_centers, centers):
break
centers = new_centers
# 计算DBI指标
dbi = davies_bouldin_score(data, labels)
dbis.append(dbi)
print('K = %d, DBI = %.4f' % (k, dbi))
# 可视化DBI指标随K的变化
plt.plot(Ks, dbis, 'bo-')
plt.title('DBI vs. K')
plt.xlabel('K')
plt.ylabel('DBI')
plt.show()
# 找出最佳聚类数K
best_k = Ks[np.argmin(dbis)]
print('最佳聚类数K为:%d' % best_k)
```
需要注意的是,代码中使用的数据文件为iris_pca.txt和iris_labels.txt,可以根据自己的实际情况进行修改。另外,DBI指标的计算方法可能有所不同,您可以根据自己的需求进行选择。
阅读全文