K-Means 聚类鸢尾花数据集:算法设计、评估与优化
K-Means 聚类鸢尾花数据集:算法设计、评估与优化
本文将使用 Python 语言,对著名的鸢尾花数据集 (iris) 进行 K-Means 聚类分析,并详细介绍算法设计、结果评估和模型优化过程。
1. 算法设计思路
- 导入 iris 数据集: 使用 Python 的
sklearn.datasets库导入 iris 数据集,并查看数据集信息。 - 数据预处理: 对数据集进行预处理,包括:
- 数据清洗:去除异常值、重复值等。
- 缺失值处理:使用均值、中位数或其他方法填充缺失值。
- 特征选择:根据需要选择关键特征,例如花萼长度、花萼宽度、花瓣长度、花瓣宽度。
- 确定聚类数 K: K-Means 算法需要预先指定聚类数 K。可以使用 肘部法则 (elbow method) 等方法来选择最佳的 K 值。
- 训练 K-Means 模型: 使用
sklearn.cluster.KMeans库训练 K-Means 模型,得到聚类中心和每个数据点所属的簇。 - 聚类结果评估: 使用以下指标评估聚类效果:
- 聚类纯度 (Purity):衡量每个簇中占主导地位的类别比例。
- 兰德系数 (Rand Index):衡量聚类结果与真实类别之间的相似度。
- F1 值 (F1-score):衡量聚类的准确性和完整性。
- 模型调优: 根据评估结果,调整聚类数 K 和其他参数,以获得最佳的 K-Means 模型。
- 使用最佳模型进行聚类: 利用训练好的 K-Means 模型对新的鸢尾花数据进行聚类。
2. 可能存在的问题
- 数据预处理阶段可能会遇到缺失值、异常值等问题,需要进行适当的处理。
- 聚类数 K 的选择可能会影响聚类效果,需要进行多次试验,并使用肘部法则等方法来辅助选择。
- 聚类结果的评估指标可能会存在主观性和不确定性,需要进行综合考虑。
3. 收获
- 掌握 K-Means 聚类算法的原理和实现方法。
- 学会如何对聚类结果进行评估和调优,提高模型性能。
- 增强数据处理和机器学习算法的实践能力。
4. 代码示例
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score, adjusted_rand_score, f1_score
import matplotlib.pyplot as plt
# 导入 iris 数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 使用肘部法则确定最佳 K 值
inertia = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X_scaled)
inertia.append(kmeans.inertia_)
plt.plot(range(1, 11), inertia)
plt.title('肘部法则')
plt.xlabel('K')
plt.ylabel('Inertia')
plt.show()
# 训练 K-Means 模型 (假设最佳 K 为 3)
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X_scaled)
# 聚类结果评估
labels = kmeans.labels_
purity = purity_score(y, labels)
rand_index = adjusted_rand_score(y, labels)
f1 = f1_score(y, labels, average='macro')
print(f'聚类纯度: {purity:.2f}')
print(f'兰德系数: {rand_index:.2f}')
print(f'F1 值: {f1:.2f}')
# 使用最佳模型进行聚类 (对新数据进行聚类)
new_data = [[5.1, 3.5, 1.4, 0.2]]
new_data_scaled = scaler.transform(new_data)
new_label = kmeans.predict(new_data_scaled)
print(f'新数据的聚类结果: {new_label}')
注:
- 以上代码仅供参考,实际应用中可能需要根据具体情况进行调整。
purity_score函数需要手动实现,代码示例如下:
from collections import Counter
def purity_score(y_true, y_pred):
'''计算聚类纯度
'''
contingency_matrix = contingency_matrix(y_true, y_pred)
return np.sum(np.max(contingency_matrix, axis=0)) / np.sum(contingency_matrix)
原文地址: https://www.cveoy.top/t/topic/j9WM 著作权归作者所有。请勿转载和采集!