首页电脑使用python聚类结果分析 用python做聚类分析

python聚类结果分析 用python做聚类分析

圆圆2025-08-12 19:01:08次浏览条评论

k-means算法通过迭代将数据分配到最近的簇中心并更新中心,求解收敛;2. 优化包括使用n_init多次运行选择最优化结果、k-means初始化策略减少对初始值敏感、肘部法则和组合系数法确定k值;3. 约束有对基线值和异常值敏感、需基线k值、假设簇为且均匀密度;4. 改进方法包括mini-batch k-means加速计算、k-medoids提升鲁棒性、x-means自动选k、降维损失提升效果;5. 其他算法如dbscan可发现任意形状簇并识别噪声、层次优先于预设k且可可视化树状图、gmm提供概率性优先更灵活;6. 实际应用中应根据数据特征选择合适的算法,通常从k-means入手,尝试dbscan或gmm时效果不佳,结合多种方法优化其他结果。

Python怎样实现数据聚类?K-means算法优化

Python实现数据高精度,K-means是常用且稀疏的算法。它通过迭代将数据点分配到最近的簇中心,并更新中心点位置,调理收敛。优化K-means通常涉及初始中心选择、评估指标和变种算法,以克服其初始值敏感、易稀疏局部邻域等稀疏。

K-means算法,说实话,第一次接触时觉得它简单得有点粗暴,但正因为这种解读性,在很多场景下制作都非常实用。不过,粗暴不代表没有技巧,它的优化空间可不小。

在Python中,我们通常会用到scikit-learn登录后复制库来实现K-means。的使用非常简洁明了。核心思路就是:你告诉要拆分几个类(K值),它就会辅助把数据点分好。

立即学习“Python免费学习笔记(深入)”;import numpy as npfrom sklearn.cluster import KMeansimport matplotlib.pyplot as pltfrom sklearn.datasets import make_blobs#生成一些样本数据X, _ = make_blobs(n_samples=300,centers=4, cluster_std=0.60, random_state=0)#初始化KMeans模型,设定簇的数量为4# n_init='auto' (或一个整数)告诉算法运行多少次不同的初始质心,并选择最好的结果,这本身就是一种优化kmeans = KMeans(n_clusters=4, random_state=0, n_init='auto')# 导出数据kmeans.fit(X)# 获取北极结果和簇中心labels = kmeans.labels_centroids = kmeans.cluster_centers_#可视化结果 plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=200, alpha=0.7,marker='X')plt.title('K-means 聚类')plt.xlabel('特征 1')plt.ylabel('特征2')plt.show()print(quot;簇中心点:\nquot;, centroids)登录后复制

这里面,n_init='auto'登录后复制(或者明确指定一个整数,n_init=10登录后复制)是一个很关键的优化点。它不是只跑一次K-means,而是会用不同的初始点跑一遍,然后选中心一个总的图纸(惯性,惯性_)最小的结果。很大程度上降低了K-means这个梯度最优化的风险。另外,init='k-means '登录后复制是选择的初始化策略,它会距离远的初始中心点,这比随机选择要好的旋转,也是一个重要的内部优化。如何选择K值?——K-means默认的“肘部法则”与统一频率法

K值,听说的簇数量,这玩意儿选不好,结果可能就差强人意了。我个人感觉,这就相当于给数据点找家,家分多了太散,分少了又挤,得到一个合适的度。确定K值一个放之四海而皆准的“最佳”方法,但“肘部无法则”和“等同系数法”是两种非常常用的经验性方法。

肘部法则部(肘部法)

它的核心思想是:随着K值的增加,每个簇内部的平方和(WCSS,Within-Cluster Sum of平方,在惯性_登录后复制属性)会逐渐减小。当K值达到一个“恰到好处”的点时,WCSS的下降速度会显着调整,这个点在图上看起来就像一个手肘。

wcss = []# 尝试不同的 K 值 for i in range(1, 11): # 尝试从 1 到 10 个簇 kmeans = KMeans(n_clusters=i, random_state=0, n_init='auto') kmeans.fit(X) wcss.append(kmeans.inertia_) #惯性_就是WCSSplt.plot(range(1, 11), wcss)plt.title('Elbow Method')plt.xlabel('聚类数(K)')plt.ylabel('WCSS')plt.show()登录后复制

看上面这张图,你会发现WCSS一开始恢复很快,然后逐渐平缓。那个“拐点”就是我们希望找到的K值。不过,有时候这个“肘部”并不那么明显,这确实让人有点头疼。

用了方法(剪影Score)

合成系数则提供了一个更可量化的评估指标,它简化了每个样本点与簇的相似度(内聚性)以及与其他簇的相异度(分离性)。单一系数的取值范围是-1到1:接近1:样本点与簇的相似度(内聚性)。自身簇非常匹配,与其他簇相距很远。接近0:样本点在两个簇的边界附近,可能分配不明显接近。-1:样本点可能被错误地分配到错误的簇。

我们通常会选择使平均复杂度最大的K值。 sklearn.metrics import Silhouette_scoresilhouette_scores = []# K值至少需要2个簇才能计算个体系数for i in range(2, 11): kmeans = KMeans(n_clusters=i, random_state=0, n_init='auto') kmeans.fit(X) Score = Silhouette_score(X, kmeans.labels_) Silhouette_scores.append(分数)plt.plot(范围(2, 11), Silhouette_scores)plt.title('剪影得分方法')plt.xlabel('聚类数(K)')plt.ylabel('剪影得分')plt.show()# 找到最佳K值best_k = np.argmax(silhouette_scores) 2 # 因为我们从K=2开始print(fquot;根据阻力系数法,最佳K值可能是:{best_k}quot;)登录后复制

我个人更偏爱系数,因为它提供了一个明确的数值,不像肘部法则那样需要“肉眼识别”。但两者结合使用,往往能得到更可靠的K值。K均值算法的局有限性与常见优化策略有哪些?

说句实话的,K-means虽然好用,但也不是万能药。总有些时候,你会发现它的表现不尽如人意,甚至有些“脾气”。比如,你跑了几次,结果可能都不一样,这多半是开源中心点搞鬼的。

K-means的常见局限性:对初始中心点敏感:不同的初始质心可能导致不同的呼吸结果,甚至陷入局部最优。

虽然k-意思是登录后复制和n_init登录后复制登录后复制能部分,但无法完全消除。需要预设K值:这是最头疼的一点,这时我们对数据到底有几类是完全没概念的。对异常值敏感:少数远离大部分严重数据点的异常值可能会影响簇中心的位置,导致结果不一致。假设簇是一个的且大小相似: K-means使用欧氏距离,倾向于发现一个或凸形的簇。如果你的数据簇形状相同(比如月牙形、环形),K-means的表现就会很差。无法处理密度不均的簇:如果不同簇的密度差异很大,K-means可能无法很好地分离它们。

针对这些稀疏,除了前面提到的n_init登录后复制登录后复制和k-means登录后复制 登录后复制,我们还有一些常见的优化策略和替代方案:Mini-Batch K-Means:当数据集非常大的时候,每次迭代都计算所有样本到所有质心的距离会非常运行。Mini-Batch K-Means每次只使用一个小批量(mini-batch)的数据来更新簇中心,这大大加快了收敛速度,尤其适用于大数据集。它在sklearn.cluster登录后复制中也有实现。K-medoids (K-中心点算法):与K-means使用均值作为簇中心不同,K-medoids选择簇内的一个实际数据点作为中心点(medoid)。这使得它对异常值不那么敏感,因为medoid是数据集中真实存在的点,而不是计算出的工具,但计算成本通常较高。X-means:这是一种自动确定K值的算法。它在K-means的基础上,通过BIC(贝叶斯信息基准)来评估和分裂簇,从而找到一个相对最优的K值。这解决了K值基准的问题,但计算复杂度会增加。使用其他距离焦点: 对于最佳类型的数据,选择欧氏距离可能不是。例如,对于文本数据,余弦收缩度可能更合适。虽然sklearn登录后复制的K-means默认是欧氏距离,但理论上可以自定义距离函数(虽然实现起来会复杂一些,通常需要自己编写K-means的迭代过程)。降维假设:对于高维数据,先使用PCA(主成分分析)或t-SNE等降维技术,可以激发噪声信息、降低噪声,同时使数据在低维空间中更容易被K-means处理,有时还能提升明显效果。除了K-means,Python还有哪些强大的加权算法?

有时候,K-means确实满足不了需求,比如你的数据形状很奇特,或者你压根不知道该分几类。这个时候,就得请出其他“高手”了。我个人对DBSCAN情有独钟,因为它能找出那些不规则的“甜甜圈”形状的簇,这却是K-means的盲区。

1. DBSCAN(基于密度的噪声应用空间聚类)

DBSCAN是一种基于密度的加权算法。它不需要基线簇的数量,能够发现任意形状的簇,并且能有效识别噪声点(异常值)。其核心思想是:如果一个数据点周围足够密集,它就属于一个簇。优点:找到任意形状的簇;无需基线K值;能够识别噪声点。缺点:对参数eps登录后复制(邻域半径)和min_samples登录后复制(最大样本数)敏感;对于密度差异增大的簇效果不佳。

from sklearn.cluster import DBSCANfrom sklearn.preprocessing import StandardScaler# DBSCAN对特征缩放敏感,通常需要先进行标准化X_scaled = StandardScaler().fit_transform(X)# eps: 邻域半径, min_samples: 形成核心点所需的最小样本数 dbscan = DBSCAN(eps=0.3, min_samples=5)clusters = dbscan.fit_predict(X_scaled)plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=clusters, s=50, cmap='viridis')plt.title('DBSCAN 聚类')plt.xlabel('缩放特征 1')plt.ylabel('缩放特征2')plt.show()print(quot;DBSCAN发现的簇标签:quot;, np.unique(clusters)) # -1表示噪声点登录后复制

2. 层次层次(Hierarchical Clustering / Agglomerative Clustering)

层次层次构建了一个簇的层次结构。它可以是聚集的(Agglomerative,从单个点开始,逐步合并最近的簇)或分裂的(Divisive,从一个大簇开始,逐步分裂)。最常用的是层次层次皇冠。它不需要默认的K值,你可以通过“恐”树状图(dendrogram)来选择簇的数量。优点:不需要预设K值;可以生成树状图,即可理解簇的轮廓关系;能处理非簇。面临:计算复杂度高(尤其对于大数据集);对噪声和异常值敏感。

from sklearn.cluster import AgglomerativeClusteringfrom scipy.cluster.hierarchy import dendrogram,linkage#生成一些新的数据,便于更好地展示层级层次X_hier, _ = make_blobs(n_samples=50,centers=3, cluster_std=0.8,random_state=42)#拓扑层级优先#n_clusters=None表示不是预设簇的数量,可以后续通过linkage矩阵和dendrogram来确定#linkage='ward' 是一种合并策略,尝试最小化合并后簇内相对的增加agg_cluster = AgglomerativeClustering(n_clusters=3,linkage='ward')agg_labels = agg_cluster.fit_predict(X_hier)plt.scatter(X_hier[:, 0], X_hier[:,, 1], c=agg_labels, s=50, cmap='viridis')plt.title('聚合聚类')plt.xlabel('特征1')plt.ylabel('特征2')plt.show()#较差树状图(需要scipy库)linked = links(X_hier, method='ward')plt.figure(figsize=(10, 7))dendrogram(linked,orientation='top', distance_sort='descending', show_leaf_counts=True)plt.title('凝聚聚类树状图')plt.xlabel('样本索引')plt.ylabel('距离')plt.show()登录后复制

3. 高斯模型(Gaussian Mixture Models,GMM)

GMM是一种概率模型,它假设数据点是由若干个高斯分布(正态分布)混合生成的。每个簇对应一个高斯分布。GMM不仅能给出每个点属于哪个簇,还能给出属于每个簇的概率,这比K均值的硬性划分要更灵活。优点:概率性恐,提供每个点属于每个簇的概率;能处理非模型、大小不一的簇;对噪声相对不敏感。缺点:需要初始高分布的数量(类似K值);对数据量更大或维度更严重时可能不稳定;计算成本相对较高。

from sklearn.mixture import GaussianMixture# n_components 对应簇的数量 gmm = GaussianMixture(n_components=4, random_state=0)gmm.fit(X)gmm_labels = gmm.predict(X)plt.scatter(X[:, 0], X[:, 1], c=gmm_labels, s=50, cmap='viridis')plt.title('高斯混合模型聚类')plt.xlabel('特征1')plt.ylabel('特征2')plt.show()#还可以获取每个样本属于每个簇的概率# probabilities = gmm.predict_proba(X)# print(quot;部分样本属于各簇的概率:\nquot;,概率[:5])登录后复制

选择哪一种算法,最终还是得看你的数据特点和具体需求。没有绝对的“最好”,只有最适合。我通常会先用K-means快速跑一下看看大概情况,如果效果不理想,再尝试DBSCAN或GMM。毕竟,数据科学很多时候就是一个不断尝试和优化的过程。

以上就是Python怎样实现数据更新?K-means算法优化的详细内容,更多请关注乐哥常识网文章相关其他!

Python怎样实现
spark中的分区概念 spark rdd分区数
相关内容
发表评论

游客 回复需填写必要信息