鸢尾花数据集的聚类分析方法探索

下载需积分: 50 | ZIP格式 | 29.48MB | 更新于2025-03-20 | 180 浏览量 | 30 下载量 举报
3 收藏
鸢尾花数据集(IRIS)是统计分类学中常用的一个数据集,由Fisher在1936年整理并发表。它包含了150个样本,分为3种类别的鸢尾花(Setosa、Versicolour、Virginica),每个种类各有50个样本。每个样本有四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度,均以厘米为单位。 聚类分析是一种无监督学习方法,目的是将数据集中的样本根据某种相似性度量分组成若干个类别。聚类算法不会使用样本的标签信息,即它是在不知道样本真实分类的情况下进行的。鸢尾花数据集作为机器学习入门的经典案例,非常适合用于演示聚类算法的效果。 在本次聚类分析中,课上提到的算法包括系统聚类算法、分解聚类算法、c均值聚类算法及其改进版本,以及ISODATA算法。下面将详细介绍这些算法: 1. 系统聚类算法(Hierarchical Clustering) 系统聚类算法通过构建层次化的聚类树来实现聚类,该算法主要分为两种类型:自下而上合并的凝聚方法(Agglomerative Hierarchical Clustering)和自上而下分裂的分解方法(Divisive Hierarchical Clustering)。在凝聚方法中,每个样本最初被看作一个单独的类,然后逐步合并成更大的类,直到满足停止条件。在分解方法中,所有样本最初合并成一个大的类,然后逐步分裂成更小的类。系统聚类的结果通常用树状图(Dendrogram)来表示。 2. c均值聚类算法(K-means Clustering) c均值算法是一种迭代算法,用于将n个数据点划分为k个簇。初始时,算法随机选择k个数据点作为聚类中心,然后分配每个数据点到最近的中心,形成k个簇。接着,算法计算每个簇的中心点,重复以上过程直到中心点不再发生变化或达到预定的迭代次数。c均值算法的一个主要缺点是需要预先指定簇的数量k,而且对异常值敏感。 3. c均值聚类算法的改进 为了克服标准c均值算法的缺点,研究者提出了许多改进版本,比如k-medoids算法和模糊c均值(Fuzzy C-means,FCM)算法。k-medoids算法通过选择簇中具有最小总距离的点作为中心,这样算法更加健壮,对噪声和离群点更不敏感。FCM算法则是将每个数据点分配到所有簇中,并为每个数据点与簇中心的距离赋予一个隶属度权重,从而允许数据点属于多个簇。 4. ISODATA算法 ISODATA(Iterative Self-Organizing Data Analysis)算法是c均值算法的一种变种,它通过迭代过程对簇中心进行更新,同时能够自动调整簇的数量和每个簇的大小。ISODATA比标准的c均值算法更加灵活,可以在聚类过程中调整簇的数量,同时算法还包括了合并和分裂簇的步骤,使得聚类的结果更加合理。 对于鸢尾花数据集IRIS,使用以上提及的聚类算法可以得到以下的分析思路和结果: - 使用系统聚类算法,可以可视化地得到一个树状图,观察不同样本之间的距离关系以及簇的形成过程。 - 应用c均值算法,可以设置不同的k值(例如k=3,与IRIS数据集中的类别数相同),并观察聚类的效果是否能够较好地划分出三个鸢尾花类别。 - 利用c均值聚类的改进算法(如k-medoids或FCM),可能会获得对噪声和离群点更加鲁棒的聚类结果,尤其是在样本质量不均或者数据量较大时。 - 通过ISODATA算法,可以在一定程度上自动确定合理的簇数量,有助于理解数据是否可以更自然地分为不同的组别。 课上所讲的算法,尽管可能属于最经典和基础的聚类方法,但它们对于理解更复杂的聚类技术和后续的算法研究仍然具有极大的价值。对这些基础算法的深入学习和应用,有助于在处理复杂数据集时选择合适的方法,并为后续的机器学习任务打下坚实的基础。在聚类分析过程中,还需注意数据预处理和特征选择的重要性,因为这些前期步骤也会影响最终的聚类结果。

相关推荐

filetype

import numpy as np from sklearn.cluster import MiniBatchKMeans from sklearn.datasets import load_iris from sklearn import preprocessing import matplotlib.pyplot as plt from pylab import mpl from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score from scipy.spatial.distance import cdist # 设置显示中文字体 mpl.rcParams["font.sans-serif"] = ["SimHei"] # 设置正常显示符号 mpl.rcParams["axes.unicode_minus"] = False np.random.seed(5) iris = load_iris() X = iris.data y = iris.target min_max_scaler = preprocessing.MinMaxScaler() X_minmax = min_max_scaler.fit_transform(X) batch_size = 15 num_cluster = 3 clf = MiniBatchKMeans(n_clusters=num_cluster, batch_size=batch_size, init='random') clf.fit(X_minmax) centers = clf.cluster_centers_ pre_clu = clf.labels_ vmarker = {0: '^', 1: 's', 2: 'D', } mValue = [vmarker[i] for i in pre_clu] for _marker, _x, _y in zip(mValue, X_minmax[:, 1], X_minmax[:, 2]): plt.scatter(_x, _y, marker=_marker,c='grey') plt.scatter(centers[:, 1], centers[:, 2], marker='*',s=200,c='black') plt.show() #手肘法则最佳k值 def sse_k(): K = range(1, 10) sse_result = [] for k in K: kmeans = KMeans(n_clusters=k) kmeans.fit(iris.data) sse_result.append(sum(np.min(cdist(iris.data, kmeans.cluster_centers_, 'euclidean'), axis=1)) / iris.data.shape[0]) plt.plot(K, sse_result, 'gx-') plt.xlabel('k') plt.ylabel(u'平均畸变程度') plt.title(u'肘部法则确定最佳的K值') plt.show() # 轮廓系统法最佳k值 def sc_k(): K = range(2, 10) score = [] for k in K: kmeans = KMeans(n_clusters=k) kmeans.fit(iris.data) score.append(silhouette_score(iris.data, kmeans.labels_, metric='euclidean')) plt.plot(K, score, 'r*-') plt.xlabel('k') plt.ylabel(u'轮廓系数') plt.title(u'轮廓系数确定最佳的K值') plt.show() sse_k() sc_k()

111 浏览量
filetype
137 浏览量
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部