K-Means与K-Medoids聚类算法比较分析

需积分: 9 1 下载量 201 浏览量 更新于2024-09-05 收藏 500KB PDF 举报
"kmeans vs kmedoids.pdf" 在数据挖掘领域,聚类是一种常见的无监督学习方法,将相似的数据对象分组到一起形成所谓的“簇”。这篇由Dr. Aishwarya Batra撰写的分析文章深入探讨了两种分区聚类算法——k-means和k-medoids,它们是数据挖掘中广泛使用的算法。聚类类似于分类,但不同之处在于它不依赖于预先定义的类别,而是由数据本身的结构来决定。 k-means是最著名的分区聚类算法之一。该算法基于质心(centroid)的概念,将数据点分配到最近的质心所在的簇。然而,k-means算法有几个显著的局限性。首先,它对初始质心的选择非常敏感,不同的初始配置可能导致完全不同的聚类结果。其次,由于每次迭代都要计算所有数据点到质心的距离,因此在处理大规模数据集时,计算成本较高。此外,k-means只能处理欧几里得距离下的球形簇,对于非凸或异形的簇效果不佳。 相比之下,k-medoids算法,也称为Partitioning Around Medoids (PAM)算法,是一种更为稳健的聚类方法。k-medoids选择实际的数据点作为代表簇的中心,即medoids,而不是像k-means那样使用数据点的平均值。这种方法使得k-medoids对离群值更具鲁棒性,并且能够处理非数值属性,因为它基于对象间的真实相似度,而不仅仅是距离。然而,k-medoids的缺点在于它的计算复杂度比k-means更高,尤其是在数据集庞大的情况下。 为了改进k-means的性能,研究人员提出了一系列方法,包括不同的初始化策略(如K-means++)和优化技术,以减少对初始质心选择的依赖,以及降低计算负担。尽管如此,k-medoids通常被认为在处理复杂簇结构和有噪声的数据时更可靠。 在实际应用中,选择k-means还是k-medoids取决于具体的需求和数据特性。如果数据集较小,且预期簇是规则形状的,k-means可能是更高效的选择。而当簇的形状不确定,或者数据中存在噪声和离群值时,k-medoids可能是更好的选择。理解这两种算法的优缺点以及它们对数据的假设,是决定在具体项目中使用哪种算法的关键步骤。 总结来说,k-means和k-medoids都是用于数据聚类的重要工具,各有其特点和适用场景。k-means以其简单和效率著称,但对初始条件和数据分布有一定假设;k-medoids则提供了更强的鲁棒性和对异常值的容忍度,但计算成本相对较高。在实际操作中,根据具体需求、数据规模和特性,以及对聚类质量的要求,选择合适的算法至关重要。

import numpy as np import pandas as pd from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from scipy.spatial.distance import cdist import matplotlib.pyplot as plt from pandas import DataFrame from sklearn.decomposition import PCA plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 pd.set_option('display.max_rows', None)#显示全部行 pd.set_option('display.max_columns', None)#显示全部列 np.set_printoptions(threshold=np.inf) pd.set_option('display.max_columns', 9000) pd.set_option('display.width', 9000) pd.set_option('display.max_colwidth', 9000) df = pd.read_csv(r'附件1.csv',encoding='gbk') X = np.array(df.iloc[:, 1:]) X=X[0:,1:] k=93 kmeans_model = KMeans(n_clusters=k, random_state=123) fit_kmeans = kmeans_model.fit(X) # 模型训练 #查看聚类结果 kmeans_cc = kmeans_model.cluster_centers_ # 聚类中心 print('各类聚类中心为:\n', kmeans_cc) kmeans_labels = kmeans_model.labels_ # 样本的类别标签 print('各样本的类别标签为:\n', kmeans_labels) r1 = pd.Series(kmeans_model.labels_).value_counts() # 统计不同类别样本的数目 print('最终每个类别的数目为:\n', r1) # 输出聚类分群的结果 # cluster_center = pd.DataFrame(kmeans_model.cluster_centers_, # columns=[ str(x) for x in range(1,94)]) # 将聚类中心放在数据框中 # cluster_center.index = pd.DataFrame(kmeans_model.labels_). \ # drop_duplicates().iloc[:, 0] # 将样本类别作为数据框索引 # print(cluster_center)代码解释

113 浏览量