通过numpy基于k-means算法的鸢尾花的分类,基于最优的k值将鸢尾花分类,并作出分类后的数据可视化图,通过计算计算平方误差或平均轮廓系数确定最优的k值,python代码实现
时间: 2024-03-10 07:45:12 浏览: 61
手工实现KNN和朴素贝叶斯算法对鸢尾花数据进行自动分类 完整代码+数据 可直接运行
5星 · 资源好评率100%
好的,以下是基于numpy和k-means算法的鸢尾花分类的Python代码实现:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 定义k-means算法函数
def k_means(X, k, max_iter=100):
# 随机初始化聚类中心
centers = X[np.random.choice(len(X), k, replace=False)]
for i in range(max_iter):
# 计算每个样本到聚类中心的距离
distances = np.linalg.norm(X[:, np.newaxis] - centers, axis=2)
# 确定每个样本所属的聚类
labels = np.argmin(distances, axis=1)
# 更新聚类中心
new_centers = np.array([X[labels == j].mean(axis=0) for j in range(k)])
# 判断聚类中心是否发生变化
if np.allclose(centers, new_centers):
break
centers = new_centers
return centers, labels
# 计算平方误差和平均轮廓系数
def calc_metrics(X, k):
centers, labels = k_means(X, k)
sse = ((X - centers[labels]) ** 2).sum()
if k == 1:
return sse, 0
else:
from sklearn.metrics import silhouette_score
score = silhouette_score(X, labels)
return sse, score
# 确定最优的k值
inertias = []
silhouette_scores = []
for k in range(1, 11):
sse, score = calc_metrics(X, k)
inertias.append(sse)
silhouette_scores.append(score)
best_k = np.argmin(inertias) + 1
# 基于最优的k值进行聚类
centers, labels = k_means(X, best_k)
# 可视化聚类结果
colors = ['red', 'blue', 'green']
for i in range(best_k):
plt.scatter(X[labels == i, 0], X[labels == i, 1], c=colors[i], label=f'Cluster {i+1}')
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='black', label='Centroids')
plt.legend()
plt.show()
```
代码中先定义了一个`k_means`函数,用于实现k-means算法。然后定义了一个`calc_metrics`函数,用于计算平方误差和平均轮廓系数。接着通过计算不同k值下的平方误差和平均轮廓系数,确定最优的k值。最后基于最优的k值进行聚类,并将聚类结果可视化。
阅读全文