2026/4/17 1:07:55
网站建设
项目流程
辽宁省住房与城乡建设厅网站,网站 空间 是什么,互联网保险对传统保险有哪些影响,深圳企业网站制作报价人工智能之核心基础 机器学习
第九章 聚类算法—公式关注公众号 文章目录 人工智能之核心基础 机器学习9.1 K-Means 聚类#x1f3af; 核心思想#xff1a;让“群内紧凑#xff0c;群间分离”#x1f511; 算法步骤#xff08;迭代优化#xff09;❓ 如何选择 K 值…人工智能之核心基础 机器学习第九章 聚类算法—公式关注公众号文章目录人工智能之核心基础 机器学习9.1 K-Means 聚类 核心思想让“群内紧凑群间分离” 算法步骤迭代优化❓ 如何选择 K 值——两大经典方法方法1肘部法则Elbow Method方法2轮廓系数Silhouette Coefficient K-Means 代码实现9.2 层次聚类Hierarchical Clustering 核心思想构建“族谱树”两种方式 距离度量簇间距离 层次聚类代码9.3 DBSCAN 聚类基于密度⚡ 核心思想找“人多的地方”忽略“孤魂野鬼” 四大核心概念 DBSCAN 代码9.4 聚类评估指标9.5 实战案例案例1K-Means 用户分群电商场景案例2DBSCAN 异常交易检测 本章总结三大聚类算法对比资料关注9.1 K-Means 聚类 核心思想让“群内紧凑群间分离”想象你要在操场上把学生分成 K 组做游戏目标是每组学生站得尽量近不同组之间离得尽量远K-Means 就是通过不断调整“组长位置”聚类中心来实现这个目标。 算法步骤迭代优化随机选 K 个点作为初始中心分配每个样本归到最近的中心用欧氏距离更新重新计算每个簇的新中心均值重复 2~3直到中心不再变化或达到最大迭代次数✅距离度量默认使用欧氏距离dist ( x , c ) ∑ i 1 d ( x i − c i ) 2 \text{dist}(x, c) \sqrt{\sum_{i1}^d (x_i - c_i)^2}dist(x,c)i1∑d(xi−ci)2❓ 如何选择 K 值——两大经典方法方法1肘部法则Elbow Method计算不同 K 下的簇内平方和WCSSWCSS ∑ k 1 K ∑ x ∈ C k ∥ x − μ k ∥ 2 \text{WCSS} \sum_{k1}^K \sum_{x \in C_k} \|x - \mu_k\|^2WCSSk1∑Kx∈Ck∑∥x−μk∥2WCSS 随 K 增大而减小找“拐点”像手肘——再增加 KWCSS 下降变缓方法2轮廓系数Silhouette Coefficient衡量样本与其所在簇的相似度 vs 与其他簇的不相似度取值范围[-1, 1]越接近1越好公式s ( i ) b ( i ) − a ( i ) max ( a ( i ) , b ( i ) ) s(i) \frac{b(i) - a(i)}{\max(a(i), b(i))}s(i)max(a(i),b(i))b(i)−a(i)a ( i ) a(i)a(i)样本 i 到同簇其他点的平均距离b ( i ) b(i)b(i)样本 i 到最近其他簇的平均距离推荐优先看轮廓系数更可靠 K-Means 代码实现importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.clusterimportKMeansfromsklearn.datasetsimportmake_blobsfromsklearn.metricsimportsilhouette_score# 生成模拟数据X,_make_blobs(n_samples300,centers4,cluster_std1.0,random_state42)# 肘部法则选Kwcss[]sil_scores[]K_rangerange(2,10)forkinK_range:kmeansKMeans(n_clustersk,random_state42)kmeans.fit(X)wcss.append(kmeans.inertia_)# WCSSsil_scores.append(silhouette_score(X,kmeans.labels_))# 可视化fig,axplt.subplots(1,2,figsize(12,4))ax[0].plot(K_range,wcss,bo-)ax[0].set_title(肘部法则)ax[0].set_xlabel(K)ax[0].set_ylabel(WCSS)ax[1].plot(K_range,sil_scores,ro-)ax[1].set_title(轮廓系数)ax[1].set_xlabel(K)ax[1].set_ylabel(Silhouette Score)plt.show()# 最终聚类假设选K4kmeansKMeans(n_clusters4,random_state42)y_predkmeans.fit_predict(X)plt.scatter(X[:,0],X[:,1],cy_pred,cmapviridis,s30)plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],cred,markerx,s200,linewidths3)plt.title(K-Means 聚类结果 (K4))plt.show()9.2 层次聚类Hierarchical Clustering 核心思想构建“族谱树”不像 K-Means 需要预先指定 K层次聚类会生成一棵树状图Dendrogram你可以在任意高度切一刀得到想要的簇数。两种方式类型过程特点凝聚式Agglomerative自底向上每个点是一簇 → 逐步合并最相似的两簇✅ 常用适合中小数据分裂式Divisive自顶向下所有点是一簇 → 逐步分裂❌ 计算复杂少用 距离度量簇间距离单链接Single Linkage两簇中最近两点的距离 → 易产生“链式效应”全链接Complete Linkage两簇中最远两点的距离 → 簇更紧凑平均链接Average Linkage所有点对的平均距离→ 平衡Ward 法合并后WCSS增加最小→ 类似K-Means推荐 层次聚类代码fromscipy.cluster.hierarchyimportdendrogram,linkagefromsklearn.clusterimportAgglomerativeClustering# 凝聚式层次聚类linkedlinkage(X,methodward)# Ward法# 绘制树状图plt.figure(figsize(10,5))dendrogram(linked,truncate_modelevel,p5)# 只显示最后5层plt.title(层次聚类树状图)plt.xlabel(样本/簇)plt.ylabel(距离)plt.show()# 指定K4进行聚类hacAgglomerativeClustering(n_clusters4,linkageward)y_hachac.fit_predict(X)plt.scatter(X[:,0],X[:,1],cy_hac,cmapplasma,s30)plt.title(层次聚类结果 (K4))plt.show()9.3 DBSCAN 聚类基于密度⚡ 核心思想找“人多的地方”忽略“孤魂野鬼”K-Means 假设簇是球形的但现实数据可能有任意形状如月牙、环形。DBSCAN 通过密度发现任意形状的簇并自动识别噪声点 四大核心概念概念定义ε 邻域Epsilon Neighborhood以点为中心、半径 ε 的圆内所有点核心点Core Pointε 邻域内至少有MinPts个点包括自己边界点Border Point在某核心点的 ε 邻域内但自身不是核心点噪声点Noise Point既不是核心点也不在任何核心点邻域内✅优点无需指定簇数量能发现任意形状簇自动剔除噪声❌缺点对参数 ε 和 MinPts 敏感密度差异大的数据效果差 DBSCAN 代码fromsklearn.clusterimportDBSCAN# DBSCAN聚类dbscanDBSCAN(eps1.5,min_samples5)y_dbdbscan.fit_predict(X_with_outliers)# 使用前面加了异常点的数据# 可视化plt.scatter(X_with_outliers[y_db!-1,0],X_with_outliers[y_db!-1,1],cy_db[y_db!-1],cmapSet1,s30,label正常簇)plt.scatter(X_with_outliers[y_db-1,0],X_with_outliers[y_db-1,1],cblack,markerx,s100,label噪声点)plt.title(DBSCAN 聚类结果)plt.legend()plt.show()print(f发现{len(set(y_db))-(1if-1iny_dbelse0)}个簇)print(f噪声点数量:{list(y_db).count(-1)})9.4 聚类评估指标 注意无监督学习没有真实标签所以不能用准确率只能用内部指标仅基于数据和聚类结果指标公式思想越好方向特点轮廓系数Silhouette群内紧密 vs 群间分离越大越好max1直观推荐首选Calinski-HarabaszCH簇间离散 / 簇内离散越大越好计算快适合凸形簇Davies-BouldinDB平均簇内距 / 簇间距越小越好对K-Means友好fromsklearn.metricsimportcalinski_harabasz_score,davies_bouldin_score labelskmeans.labels_print(轮廓系数:,silhouette_score(X,labels))print(CH指数:,calinski_harabasz_score(X,labels))print(DB指数:,davies_bouldin_score(X,labels))9.5 实战案例案例1K-Means 用户分群电商场景# 模拟用户数据年消费、访问频率、平均订单金额np.random.seed(42)usersnp.random.rand(500,3)users[:,0]*10000# 年消费0~10000元users[:,1]*50# 访问频率0~50次/月users[:,2]*500# 平均订单0~500元# 标准化K-Means对尺度敏感fromsklearn.preprocessingimportStandardScaler scalerStandardScaler()users_scaledscaler.fit_transform(users)# 聚类kmeansKMeans(n_clusters3,random_state42)user_clusterskmeans.fit_predict(users_scaled)# 分析各群特征importpandasaspd dfpd.DataFrame(users,columns[年消费,访问频率,平均订单])df[群组]user_clustersprint(df.groupby(群组).mean())输出示例年消费 访问频率 平均订单 群组 0 8500.2 45.1 420.3 → 高价值用户 1 1200.5 10.2 80.1 → 普通用户 2 5000.8 30.5 200.7 → 中等活跃用户案例2DBSCAN 异常交易检测# 模拟交易数据金额、时间小时、地点经纬度简化transactionsnp.random.randn(1000,3)transactions[:,0]np.abs(transactions[:,0])*1000# 金额 0transactions[:,1](transactions[:,1]12)%24# 时间 0-24# 加入异常交易深夜大额anomaliesnp.array([[15000,3,0.5],[20000,2,-0.8]])transactions_fullnp.vstack([transactions,anomalies])# DBSCAN检测dbscanDBSCAN(eps2.0,min_samples10)labelsdbscan.fit_predict(transactions_full)# 输出异常交易anomaly_indicesnp.where(labels-1)[0]print(检测到异常交易:)foridxinanomaly_indices:amt,hour,loctransactions_full[idx]print(f 金额: ¥{amt:.0f}, 时间:{hour:.1f}点, 位置特征:{loc:.2f}) 本章总结三大聚类算法对比算法是否需指定K簇形状噪声处理速度适用场景K-Means✅ 是球形❌ 不能⭐⭐⭐⭐用户分群、快速原型层次聚类❌ 否可后选球形❌ 不能⭐⭐小数据、需要树状结构DBSCAN❌ 否任意✅ 自动识别⭐⭐⭐异常检测、非球形簇建议先试K-Means快、简单如果簇形状奇怪 → 用DBSCAN数据量小且想探索层次关系 → 用层次聚类资料关注公众号咚咚王giteehttps://gitee.com/wy18585051844/ai_learning《Python编程从入门到实践》《利用Python进行数据分析》《算法导论中文第三版》《概率论与数理统计第四版 (盛骤) 》《程序员的数学》《线性代数应该这样学第3版》《微积分和数学分析引论》《西瓜书周志华-机器学习》《TensorFlow机器学习实战指南》《Sklearn与TensorFlow机器学习实用指南》《模式识别第四版》《深度学习 deep learning》伊恩·古德费洛著 花书《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》《深入浅出神经网络与深度学习(迈克尔·尼尔森MichaelNielsen》《自然语言处理综论 第2版》《Natural-Language-Processing-with-PyTorch》《计算机视觉-算法与应用(中文版)》《Learning OpenCV 4》《AIGC智能创作时代》杜雨张孜铭《AIGC原理与实践零基础学大语言模型、扩散模型和多模态模型》《从零构建大语言模型中文版》《实战AI大模型》《AI 3.0》