西安模板做网站,自己的免费网站空间,建立企业网站价格,wordpress网站维护中任务一
对以下数据集使用K均值聚类算法#xff1a;
1#xff09;观察实验结果是否符合预期#xff1b;
2#xff09;利用SSE标准确定K值#xff1b;
3#xff09;自行调参并观察对聚类结果的影响。
注意#xff1a;需要把类别信息去掉。 “tutorial3_Data Explorat…任务一
对以下数据集使用K均值聚类算法
1观察实验结果是否符合预期
2利用SSE标准确定K值
3自行调参并观察对聚类结果的影响。
注意需要把类别信息去掉。 “tutorial3_Data Exploration”中的鸢尾花数据集“iris.data” “tutorial4_Data Preprocessing”中的癌症数据集“breast-cancer-wisconsin.data” breast-cancer-wisconsin.data import pandas as pdcancer pd.read_csv(D:\\数据挖掘\\实验3 聚类 代码与数据\\breast-cancer-wisconsin.data,headerNone,names[id,Clump Thickness,Uniformity of Cell Size,Uniformity of Cell Shape,Marginal Adhesion,Single Epithelial Cell Size,Bare Nuclei,Bland Chromation,Normal Nucleoli,Mitoses,Class])cancer import pandas as pd
import numpy as np
from sklearn import cluster
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer# 数据预处理
cancer.replace(?, np.nan, inplaceTrue) # 将 ? 替换为 NaN
cancer.dropna(inplaceTrue) # 删除包含 NaN 值的行
cancer cancer.astype(float) # 将数据类型转换为浮点型# 使用SimpleImputer填补缺失值
imputer SimpleImputer(strategymedian)
cancer_imputed imputer.fit_transform(cancer)# 数据缩放
scaler StandardScaler()
data_scaled scaler.fit_transform(cancer_imputed)# 将缩放后的数据转换为 DataFrame
data_scaled_df pd.DataFrame(data_scaled, columnscancer.columns)# 删除 Class 列
data data_scaled_df.drop(Class, axis1)
data data_scaled_df.drop(id, axis1)# 使用K均值聚类算法
k_means cluster.KMeans(n_clusters2, max_iter100, random_state1)
k_means.fit(data)
labels k_means.labels_# 创建 DataFrame 来存储聚类结果
result_df pd.DataFrame(labels, indexcancer.index, columns[Cluster ID])
print(result_df[Cluster ID].value_counts()) # 打印各个簇的样本数量pd.DataFrame(labels, indexcancer.id, columns[Cluster ID]) # 训练不同K值下的KMeans模型并记录SSE
sse []
k_range range(1, 11)
for k in k_range:kmeans KMeans(n_clustersk, random_state42)kmeans.fit(data) sse.append(kmeans.inertia_)# 绘制SSE与K值的关系图
import matplotlib.pyplot as pltplt.plot(k_range, sse, markero)
plt.xlabel(Number of clusters (K))
plt.ylabel(Sum of Squared Errors (SSE))
plt.title(Elbow Method for Optimal K)
plt.show()
利用SEE标准确定K发现拐点在k2的时候说明k的最优值是2符合该数据集 调整参数
max_iter最大迭代次数通过改变最大迭代次数发现对分类的影响不是很大 改变k值可以得出和上面一样的结论k为2的时候的效果最好 改变tol发现收敛阈值对于模型的性能的影响不是很大 任务二 层次聚类层次聚类学习笔记-CSDN博客https://blog.csdn.net/qq_55552561/article/details/135165713?spm1001.2014.3001.5501 任务三
查阅scikit-learn文档中的数据生成器Samples generatorhttps://scikit-learn.org/stable/modules/classes.html#module-sklearn.datasets 请至少生成5种不同形状或者分布的数据集并使用DBScan和谱聚类进行聚类分析观察实验结果结合算法原理进行分析。 谱聚类和DBscan数据挖掘--聚类-CSDN博客 数据生成器scikit-learn文档中的数据生成器-CSDN博客 生成数据 # 生成数据集 datasets [ make_blobs(n_samples1000, centers3, cluster_std1.0, random_state42), make_moons(n_samples1000, noise0.1, random_state42), make_circles(n_samples1000, noise0.05, factor0.5, random_state42), make_classification(n_samples1000, n_features20, n_classes2, n_clusters_per_class2), make_regression(n_samples100, n_features2) ] from sklearn.datasets import make_blobs, make_moons, make_circles,make_classification,make_regression
from sklearn.cluster import DBSCAN, SpectralClustering
import matplotlib.pyplot as plt# 生成数据集
datasets [make_blobs(n_samples1000, centers3, cluster_std1.0, random_state42),make_moons(n_samples1000, noise0.1, random_state42),make_circles(n_samples1000, noise0.05, factor0.5, random_state42),make_classification(n_samples1000, n_features20, n_classes2, n_clusters_per_class2),make_regression(n_samples100, n_features2)
]# DBSCAN 和谱聚类参数设置
dbscan DBSCAN(eps0.1, min_samples5)
spectral SpectralClustering(n_clusters3, affinitynearest_neighbors, random_state42)# 数据集索引
dataset_names [Blobs, Moons, Circles, S Curve, Swiss Roll]# 分别对每个数据集进行可视化和聚类分析
for idx, (X, y) in enumerate(datasets):# 可视化原始数据集plt.figure(figsize(18, 4))# 绘制原始数据集plt.subplot(1, 3, 1)plt.scatter(X[:, 0], X[:, 1], cy, cmapviridis)plt.title(fOriginal {dataset_names[idx]} Dataset)plt.xlabel(Feature 1)plt.ylabel(Feature 2)# DBSCAN 聚类dbscan.fit(X)db_labels dbscan.labels_# 谱聚类spectral.fit(X)spectral_labels spectral.labels_# 绘制DBSCAN聚类结果plt.subplot(1, 3, 2)plt.scatter(X[:, 0], X[:, 1], cdb_labels, cmapviridis)plt.title(fDBSCAN Clustering on {dataset_names[idx]})plt.xlabel(Feature 1)plt.ylabel(Feature 2)# 绘制谱聚类结果plt.subplot(1, 3, 3)plt.scatter(X[:, 0], X[:, 1], cspectral_labels, cmapviridis)plt.title(fSpectral Clustering on {dataset_names[idx]})plt.xlabel(Feature 1)plt.ylabel(Feature 2)plt.tight_layout()plt.show()运行得到的结果
可以看出聚类存在很大的问题特别是谱聚类因为按理说谱聚类是对kmeans的一个方面的改进应该可以比较好地对圆形数据和月牙形地数据做一个比较好的分类但上述结果明显没有做到于是下面将五个数据集分开对不同的数据集用不一样的明显参数进行分类。
此外在对数据生成的函数的进一步的了解发现make_classification和make_swiss_roll生成的数据不适用于对聚类算法的研究于是下面只研究Blobs、Moons和Circle的数据。
Blobs数据:
修改了DBscan参数
# DBSCAN 和谱聚类参数设置
dbscan DBSCAN(eps0.5, min_samples5)
spectral SpectralClustering(n_clusters3, affinitynearest_neighbors, random_state42)
下面是三种不同的Blobs数据 这个数据集上DBscan和谱聚类的分类效果都挺好的 在上述这个数据集上的聚类可以明显看出DBSCAN没有正确地进行分类进行过多次调参都没有办法达到更好的分类效果 在给定的合成数据集中既有 DBSCAN 及谱聚类未能很好地对数据进行有效聚类。DBSCAN 未能有效识别形状复杂且交错的数据结构这是因为 DBSCAN 对于类别之间的密度差异和噪声数据敏感对于密度相近的区域难以分辨。而对于谱聚类尽管它能够在某些情况下处理非凸形状的聚类结构但它仍然基于样本之间的相似度图进行聚类难以很好地解决数据交错在一起的情况。 对于交错在一起的数据即使是 DBSCAN 和谱聚类这样的聚类算法也可能遇到困难。DBSCAN 依赖于密度可达性的概念因此无法很好地处理密度相似的区域谱聚类虽然不受凸形状的限制但也是基于样本之间的相似性度量因此在处理交错在一起的数据时也存在挑战。 对于类似这种交错在一起的数据结构可能需要更复杂或更适合此类情况的聚类方法或者在应用传统聚类算法之前对数据进行特征工程或预处理以更好地凸显数据内部的聚类结构比如使用核方法、降维技术等。另外使用可视化工具对数据进行分析能够帮助更好地理解数据的特性及算法的表现从而为选择适当的聚类算法提供指导。
Moons数据
修改了谱聚类的参数
# DBSCAN 和谱聚类参数设置
dbscan DBSCAN(eps0.1, min_samples5)
spectral SpectralClustering(n_clusters2, affinityrbf, random_state42,gamma500) Circles数据
使用和上面这个月牙形一样的参数
# DBSCAN 和谱聚类参数设置
dbscan DBSCAN(eps0.1, min_samples5)
spectral SpectralClustering(n_clusters2, affinityrbf, random_state42,gamma500)