实验名称:K-means聚类
实验目的:
1.学习数据预处理和标准化方法。
2.掌握K-means聚类算法的基本原理和实现。
3.学习选择合适的K值的方法。
4.使用不同的评价指标对聚类结果进行评估。
5.通过数据可视化展示聚类效果。
实验步骤与要求:
1. 数据集预处理与标准化
数据集导入:选择一个适合聚类分析的数据集(如Iris数据集或客户消费数据)。
数据预处理:处理缺失值、去除异常值等。
数据标准化:将数据进行标准化处理,如归一化或Z-score标准化。
2. K-means聚类算法实现
算法原理:简要说明K-means算法的原理,包括初始化、迭代优化过程。
实现过程:使用编程语言(如Python)实现K-means算法,可以使用现有库如scikit-learn。
3. 聚类结果分析
结果展示:展示K-means算法的聚类结果,包括每个聚类的中心点和各个数据点的分配情况。
评价指标:使用评价指标对聚类效果进行评估。
4. 数据可视化
二维/三维可视化:如果数据维度较高,进行主成分分析(PCA)或t-SNE降维,将聚类结果在二维或三维空间中可视化。
聚类效果展示:使用不同颜色或形状表示不同的聚类,直观展示聚类效果。
5. 实验总结
结果分析:总结实验结果,分析K-means聚类算法的优缺点以及适用场景。
1.实验步骤及流程
2.算法原理及实现过程
(1)数据预处理:标准化特征值,使得每个特征具有零均值和单位方差。
(2)层次聚类:应用层次聚类算法,将数据进行分组。
(3)PCA降维和可视化:通过PCA降维到二维以便于可视化展示。
(4)树状图绘制:展示层次聚类的树状结构,用于理解聚类过程。
(5)聚类质量评估:计算轮廓系数和调整后的兰德指数等指标,评估聚类效果。
(6)数据分布和关系的可视化:通过直方图和散点矩阵图,展示特征分布及特征之间的关系。
3.结果展示
4. 评价
(1)轮廓系数(Silhouette Score):
轮廓系数衡量了聚类结果的紧密度和分离度,取值范围为[-1, 1],值越接近1表示聚类结果越好。实验中计算了轮廓系数,并打印了其平均值。具体数值越高表示聚类效果越好。
(2)调整后的兰德指数(Adjusted Rand Index):
调整后的兰德指数用于衡量聚类结果与真实标签之间的相似度,取值范围为[-1, 1],值越接近1表示聚类结果与真实标签越一致。实验中计算了调整后的兰德指数,并打印了其数值。具体数值越高表示聚类效果与真实标签的匹配程度越高。
-
数据可视化结果展示.
5.实验总结
本实验全面展示了对Iris数据集进行层次聚类分析的过程和结果,同时通过评价指标对聚类效果进行了客观评估,为进一步分析和应用提供了有效的参考。主要从以下几个方面进行:
(1)数据预处理:使用标准化处理对数据进行预处理,确保每个特征具有相同的重要性。
(2)层次聚类:应用层次聚类算法对预处理后的数据进行分组,将数据划分为不同的簇。
(3)PCA降维和可视化:使用PCA将数据降维到二维,并绘制原始数据和聚类结果的二维投影图,直观展示聚类效果。
(4)树状图绘制:
绘制了层次聚类的树状图,可视化展示了聚类过程和簇的组织结构。
(5)聚类质量评估:
计算了轮廓系数和调整后的兰德指数,评估了聚类结果的质量。得到的指标值可以帮助判断聚类的效果好坏。
(6)数据分布和关系的可视化:
绘制了特征的分布直方图和聚类结果的散点矩阵图,展示了数据的分布情况和特征之间的关系。
6.源代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage
from sklearn.decomposition import PCA
from sklearn.metrics import silhouette_score, adjusted_rand_score
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 数据预处理(标准化)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 聚类
agg_clustering = AgglomerativeClustering(n_clusters=3)
y_pred = agg_clustering.fit_predict(X_scaled)
# 使用 PCA 降维到 2 个主成分以便可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
# 绘制原始数据的二维 PCA 投影
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='rainbow', edgecolor='k', s=50)
plt.title('Original Iris Data (PCA)')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
# 绘制聚类结果
plt.subplot(1, 2, 2)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y_pred, cmap='rainbow', edgecolor='k', s=50)
plt.title('Agglomerative Clustering Results (PCA)')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
# 绘制层次聚类树状图(dendrogram)
linked = linkage(X_scaled, 'ward')plt.figure(figsize=(10, 7))
dendrogram(linked, orientation='top', distance_sort='descending', show_leaf_counts=True)
plt.title('Dendrogram (Iris Dataset)')
plt.show()
# 计算并打印聚类质量指标
silhouette_avg = silhouette_score(X_scaled, y_pred)
ari = adjusted_rand_score(y, y_pred)
print(f'Silhouette Score: {silhouette_avg:.3f}')
print(f'Adjusted Rand Index: {ari:.3f}')
# 绘制每个簇的分布直方图
plt.figure(figsize=(12, 6))
for i in range(4):
plt.subplot(2, 2, i+1)
plt.hist(X[:, i], bins=20, color='blue', edgecolor='black')
plt.title(iris.feature_names[i])
plt.suptitle('Feature Distributions')
plt.show()
# 绘制聚类结果的散点矩阵图
from pandas.plotting import scatter_matrix
import pandas as pd
df = pd.DataFrame(X, columns=iris.feature_names)
df['Cluster'] = y_pred
scatter_matrix(df, alpha=0.8, figsize=(12, 12), diagonal='kde', c=y_pred, cmap='rainbow',
marker='o')
plt.suptitle('Scatter Matrix of Clustering Results')
plt.show()