资讯动态

Python-sklearn-聚类

发布时间:2026/8/15 7:39:57 来源:尧图企业网站定制
Sklearn 聚类算法sklearn.cluster提供 K-Means、层次聚类、DBSCAN、GMM 等经典聚类算法。 基于划分的聚类1.KMeans— K 均值聚类 ⭐fromsklearn.clusterimportKMeans modelKMeans(n_clusters8,# 簇的数量initk-means,# k-means 或 random 或 ndarrayn_initauto,# 初始化运行次数auto1 次int多次取最优max_iter300,# 单次运行的最大迭代次数tol1e-4,# 收敛容忍度verbose0,random_state42,copy_xTrue,algorithmlloyd# lloyd,elkan(密集数据快),full,auto)model.fit(X)# 核心属性print(model.cluster_centers_)# 簇中心 (n_clusters, n_features)print(model.labels_)# 每个样本的簇标签print(model.inertia_)# 样本到最近簇中心的平方距离之和 ⭐print(model.n_iter_)# 迭代次数print(model.n_features_in_)# 特征数# 预测新样本labelsmodel.predict(X_new)# 将新样本分配到最近簇# 变换到各簇中心的距离distancesmodel.transform(X)# (n_samples, n_clusters) → 可以用作降维特征# 一步到位labelsmodel.fit_predict(X)2.MiniBatchKMeans— 小批量 K 均值fromsklearn.clusterimportMiniBatchKMeans modelMiniBatchKMeans(n_clusters8,initk-means,max_iter100,batch_size1024,# 每批样本数verbose0,random_state42,tol0.0,max_no_improvement10,# 连续无改善轮数init_sizeNone,# 初始化的样本数n_init3,reassignment_ratio0.01# 重新分配中心的比例)model.fit(X)# 支持 partial_fit在线学习model.partial_fit(X_batch) 基于密度的聚类1.DBSCAN— 密度聚类 ⭐fromsklearn.clusterimportDBSCAN modelDBSCAN(eps0.5,# 邻域半径min_samples5,# 核心点所需的最小邻域点数metriceuclidean,# 距离度量metric_paramsNone,algorithmauto,# auto,ball_tree,kd_tree,bruteleaf_size30,# BallTree/KDTree 的叶大小pNone,# Minkowski 度量的幂参数n_jobsNone)model.fit(X)# 核心属性print(model.labels_)# -1噪音, 0簇标签print(model.core_sample_indices_)# 核心样本的索引print(model.components_)# 每个核心样本的副本# 注意: DBSCAN 没有 predict 方法# 对新数据需使用训练后的 dbscan 作为 nearest neighbors 查询调参指南:fromsklearn.neighborsimportNearestNeighborsimportnumpyasnpimportmatplotlib.pyplotasplt# K-距离图选择合适的 epsk5# 一般取 min_samples 值nbrsNearestNeighbors(n_neighborsk).fit(X)distances,indicesnbrs.kneighbors(X)k_distnp.sort(distances[:,-1])plt.plot(k_dist)plt.xlabel(Points sorted by distance)plt.ylabel(f{k}-NN distance)plt.title(K-distance Graph (elbow method))plt.show()# 曲线的肘部即为合适的 eps2.OPTICS— 排序点识别聚类结构fromsklearn.clusterimportOPTICS modelOPTICS(min_samples5,max_epsnp.inf,# 最大邻域半径metricminkowski,p2,cluster_methodxi,# xi 或 dbscanepsNone,# 提取簇的阈值cluster_methoddbscan 时需要xi0.05,# 最小陡度cluster_methodxi 时predecessor_correctionTrue,min_cluster_sizeNone,# 最小簇大小algorithmauto,leaf_size30,n_jobsNone)model.fit(X)print(model.labels_)# 簇标签-1噪音print(model.reachability_)# 可达距离print(model.ordering_)# 簇排序print(model.core_distances_)# 核心距离print(model.predecessor_)# 前驱索引3.HDBSCAN— 层次 DBSCANfromsklearn.clusterimportHDBSCAN modelHDBSCAN(min_cluster_size5,# 最小簇大小min_samplesNone,# 保守性越大越保守cluster_selection_epsilon0.0,max_cluster_sizeNone,# 最大簇大小metriceuclidean,alpha1.0,# 距离持久性algorithmauto,leaf_size40,n_jobsNone,cluster_selection_methodeom,# eom(Excess of Mass) 或 leafallow_single_clusterFalse,store_centersNone)model.fit(X)print(model.labels_)print(model.probabilities_)# 每个样本的簇成员强度 (0~1)print(model.cluster_persistence_)# 每个簇的持久性分数# HDBSCAN 特有的方法soft_clustersmodel.membership_vector()# 软聚类向量️ 基于层次的聚类1.AgglomerativeClustering— 凝聚层次聚类 ⭐fromsklearn.clusterimportAgglomerativeClustering modelAgglomerativeClustering(n_clusters2,# 目标簇数metriceuclidean,# 距离度量linkageward,# 链接准则# ward — 最小方差仅 euclidean# complete — 最大距离最远邻# average — 平均距离# single — 最小距离最近邻connectivityNone,# 连接性约束矩阵compute_distancesFalse,# 存储距离矩阵distance_thresholdNone,# 距离阈值代替 n_clusters)model.fit(X)print(model.labels_)print(model.n_clusters_)# 估计的簇数print(model.n_leaves_)# 树的叶节点数print(model.children_)# 每个合并步骤的子节点 (2, n_samples-1)print(model.distances_)# 每个合并步骤的距离compute_distancesTrue使用距离阈值而非指定 K:modelAgglomerativeClustering(n_clustersNone,distance_threshold0,# 设置为 0 会计算全树linkageward)model.fit(X)2.FeatureAgglomeration— 特征凝聚fromsklearn.clusterimportFeatureAgglomeration modelFeatureAgglomeration(n_clusters2,metriceuclidean,linkageward,pooling_funcnp.mean# 合并后特征的聚合函数)X_reducedmodel.fit_transform(X)print(model.labels_)# 每个原始特征的簇标签3.Birch— 层次聚类大数据友好fromsklearn.clusterimportBirch modelBirch(threshold0.5,# 子簇合并阈值branching_factor50,# 每个节点的最大 CF 子簇数n_clusters3,# 最终簇数compute_labelsTrue,copyTrue)model.fit(X)print(model.labels_)print(model.root_)# 内部树的根节点print(model.subcluster_centers_)# 子簇中心# 支持 partial_fitmodel.partial_fit(X_batch) 基于模型的聚类GaussianMixture— 高斯混合模型GMMfromsklearn.mixtureimportGaussianMixture modelGaussianMixture(n_components1,# 混合成分数covariance_typefull,# full,tied,diag,sphericaltol1e-3,reg_covar1e-6,# 协方差对角线上加的正则化max_iter100,n_init1,# 初始化次数init_paramskmeans,# kmeans,k-means,random,random_from_dataweights_initNone,means_initNone,precisions_initNone,random_stateNone,warm_startFalse,verbose0,verbose_interval10)model.fit(X)# 关键属性print(model.weights_)# 各成分的混合权重print(model.means_)# 各成分的均值print(model.covariances_)# 各成分的协方差print(model.precisions_)# 各成分的精度矩阵协方差逆print(model.precisions_cholesky_)# 精度矩阵的 Cholesky 分解print(model.converged_)# 是否收敛print(model.n_iter_)# 实际迭代数print(model.lower_bound_)# 对数似然的下界# 预测方法labelsmodel.predict(X)# 硬分配probsmodel.predict_proba(X)# 软分配后验概率log_likelihoodmodel.score(X)# 每个样本的对数似然total_llmodel.score_samples(X)# 加权对数似然# 采样X_sampled,y_sampledmodel.sample(n_samples100)# AIC / BIC模型选择print(model.aic(X))print(model.bic(X))GMM 模型选择:importnumpyasnp n_componentsrange(1,11)models[GaussianMixture(n,random_state42).fit(X)forninn_components]bics[m.bic(X)forminmodels]aics[m.aic(X)forminmodels]best_nn_components[np.argmin(bics)]print(fBest n_components (BIC):{best_n})BayesianGaussianMixture— 贝叶斯 GMMfromsklearn.mixtureimportBayesianGaussianMixture modelBayesianGaussianMixture(n_components10,# 设置足够大的初始值covariance_typefull,tol1e-3,reg_covar1e-6,max_iter1000,n_init1,init_paramskmeans,weight_concentration_prior_typedirichlet_process,# dirichlet_process — 自动推断成分数# dirichlet_distribution — 固定成分数weight_concentration_priorNone,# Dirichlet 先验浓度mean_precision_priorNone,mean_priorNone,degrees_of_freedom_priorNone,covariance_priorNone,random_stateNone,warm_startFalse,verbose0)model.fit(X)print(model.weights_)# 部分权重接近 0自动选择成分数print(model.n_components)# 原始设定的成分数# 实际有效的成分数effective_nnp.sum(model.weights_0.01)print(fEffective components:{effective_n}) 其他聚类算法1.MeanShift— 均值漂移fromsklearn.clusterimportMeanShift modelMeanShift(bandwidthNone,# 带宽None 用 estimate_bandwidth 估计seedsNone,# 初始核位置bin_seedingFalse,# 使用离散化加速min_bin_freq1,cluster_allTrue,# 是否将所有点分配给簇False 时孤立点为 -1n_jobsNone,max_iter300)model.fit(X)print(model.cluster_centers_)print(model.labels_)print(model.n_iter_)# 带宽估计fromsklearn.clusterimportestimate_bandwidth bandwidthestimate_bandwidth(X,quantile0.3,n_samples500,random_state42)2.AffinityPropagation— 近邻传播fromsklearn.clusterimportAffinityPropagation modelAffinityPropagation(damping0.5,# 阻尼因子 (0.5~1)max_iter200,convergence_iter15,# 连续迭代无变化判定收敛copyTrue,preferenceNone,# 优先度None相似度中值affinityeuclidean,# 或 precomputedverboseFalse,random_stateNone)model.fit(X)print(model.cluster_centers_indices_)# 簇中心在原数据中的索引print(model.labels_)print(model.affinity_matrix_)# 相似度矩阵print(model.n_iter_)3.SpectralClustering— 谱聚类fromsklearn.clusterimportSpectralClustering modelSpectralClustering(n_clusters8,eigen_solverNone,# None,arpack,lobpcg,amgn_componentsNone,# 谱嵌入维度random_state42,n_init10,# k-means 运行次数gamma1.0,# RBF 核参数affinityrbf,# rbf,nearest_neighbors,precomputed,callablen_neighbors10,# nearest_neighbors affinity 的邻居数eigen_tolauto,assign_labelskmeans,# kmeans,discretize,cluster_qrdegree3,# 多项式核的次数coef01# 多项式核/ sigmoid 核的独立项)model.fit(X)print(model.labels_)print(model.affinity_matrix_)# 亲和矩阵4.SpectralBiclustering/SpectralCoclustering— 谱双聚类fromsklearn.clusterimportSpectralBiclustering,SpectralCoclustering# 双聚类同时对行和列聚类modelSpectralBiclustering(n_clusters3,methodbistochastic,# bistochastic,scale,logn_components6,n_best3,svd_methodrandomized,n_svd_vecsNone,mini_batchFalse,initk-means,n_init10,random_state42)model.fit(X)print(model.row_labels_)# 行标签print(model.column_labels_)# 列标签# 共聚类仅用于文档-词矩阵modelSpectralCoclustering(n_clusters3,random_state42)model.fit(X)print(model.row_labels_)print(model.column_labels_) 选择簇数 K肘部法则Elbow Methodfromsklearn.clusterimportKMeansimportmatplotlib.pyplotasplt inertias[]K_rangerange(1,11)forkinK_range:kmKMeans(n_clustersk,random_state42,n_init10)km.fit(X)inertias.append(km.inertia_)plt.plot(K_range,inertias,bo-)plt.xlabel(k)plt.ylabel(Inertia)plt.title(Elbow Method)plt.show()轮廓系数fromsklearn.metricsimportsilhouette_score silhouettes[]forkinrange(2,11):kmKMeans(n_clustersk,random_state42,n_init10)labelskm.fit_predict(X)silsilhouette_score(X,labels)silhouettes.append(sil)best_kK_range[np.argmax(silhouettes)] 算法选择指南场景推荐一般用途、快速KMeans大数据集在线学习MiniBatchKMeans任意形状簇、含噪音DBSCAN变密度簇HDBSCAN/OPTICS层次结构AgglomerativeClustering软聚类、概率GaussianMixture自动推断簇数BayesianGaussianMixture非凸簇SpectralClusteringK 已知、球形簇KMeans[[sklearn-总览|← 返回总览]]

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价