2026/4/3 14:41:18
网站建设
项目流程
商会联盟网站建设方案,佛山南海建设局网站,工作台,超级优化系统Day 86#xff1a;【99天精通Python】机器学习进阶 - K-Means 聚类 - 让数据自动站队
前言
欢迎来到第86天#xff01;
在之前的机器学习课程中#xff0c;我们处理的都是有监督学习 (Supervised Learning)。
这意味着我们的数据都带有标签 (Label)#xff0c;…Day 86【99天精通Python】机器学习进阶 - K-Means 聚类 - 让数据自动站队前言欢迎来到第86天在之前的机器学习课程中我们处理的都是有监督学习 (Supervised Learning)。这意味着我们的数据都带有标签 (Label)比如这张图片是猫这个房价是300万。但现实中大量的数据是没有标签的。比如你有一堆用户的消费记录但你不知道他们属于哪个消费群体。无监督学习 (Unsupervised Learning)就是要让机器在没有标签的数据中自动发现隐藏的结构。聚类 (Clustering)是其中最常用的一种。K-Means是最经典的聚类算法它的目标是把数据分成 K 个簇让同一个簇内的数据尽可能相似不同簇之间的数据尽可能不同。本节内容K-Means 算法原理Sklearn 中的KMeans评估指标轮廓系数 (Silhouette Score)手肘法 (Elbow Method) 确定 K 值实战练习客户分群一、K-Means 原理“物以类聚人以群分”算法流程很简单初始化随机选择 K 个点作为初始的质心 (Centroids)。分配 (Assignment)计算每个数据点到各个质心的距离把它分到最近的那个簇。更新 (Update)重新计算每个簇的平均值将质心移动到这个平均值的位置。重复2-3 步直到质心不再移动。[外链图片转存中…(img-346iHRze-1768773799828)]二、Sklearn 实现我们用make_blobs生成一些用于聚类的数据。fromsklearn.datasetsimportmake_blobsfromsklearn.clusterimportKMeansimportmatplotlib.pyplotasplt# 1. 生成数据# n_samples: 样本数, centers: 簇中心数, cluster_std: 簇内标准差X,ymake_blobs(n_samples300,centers4,cluster_std0.8,random_state42)# 可视化原始数据plt.scatter(X[:,0],X[:,1],s50)# plt.show()# 2. 创建并训练模型# n_clusters4: 我们想分成 4 个簇kmeansKMeans(n_clusters4,random_state42,n_initauto)kmeans.fit(X)# 3. 获取结果labelskmeans.labels_# 每个点的标签 (0, 1, 2, 3)centerskmeans.cluster_centers_# 4 个质心的坐标# 4. 可视化结果plt.scatter(X[:,0],X[:,1],clabels,s50,cmapviridis)plt.scatter(centers[:,0],centers[:,1],cred,s200,alpha0.75,markerX)plt.title(K-Means Clustering Result)# plt.show()三、如何确定 K 值在实际问题中我们事先并不知道数据应该分成几类。K-Means 的一个缺点就是需要手动指定 K 值。我们有两种常用的方法来辅助判断。3.1 手肘法 (Elbow Method)计算不同 K 值下的簇内平方和 (Inertia)。Inertia 越小说明簇内越紧凑。随着 K 增大Inertia 肯定会减小。我们寻找那个拐点手肘即 K 再增大Inertia 下降得不那么明显的地方。inertia_list[]forkinrange(1,11):kmeansKMeans(n_clustersk,random_state42,n_initauto)kmeans.fit(X)inertia_list.append(kmeans.inertia_)plt.plot(range(1,11),inertia_list,markero)plt.xlabel(Number of clusters (K))plt.ylabel(Inertia)plt.title(Elbow Method For Optimal K)# plt.show()# 在图中K4 处是一个明显的拐点3.2 轮廓系数 (Silhouette Score)轮廓系数同时考虑了簇内紧凑度和簇间分离度。分数范围 [-1, 1]。越接近 1聚类效果越好。fromsklearn.metricsimportsilhouette_score scoresilhouette_score(X,labels)print(f轮廓系数:{score:.2f})# e.g. 0.82四、实战练习客户分群假设我们有一份商场客户数据包含年收入和消费分数 (1-100)。importpandasaspd# 1. 准备数据data{Annual Income (k$):[15,15,16,16,17,18],Spending Score (1-100):[39,81,6,77,40,6]}# (为了演示这里只用少量数据实际中应该是上千条)dfpd.DataFrame(data)# 2. 标准化 (距离敏感必须标准化)fromsklearn.preprocessingimportStandardScaler scalerStandardScaler()X_scaledscaler.fit_transform(df)# 3. 用手肘法找 K# ... (略)# 4. 训练 (假设我们决定 K3)kmeansKMeans(n_clusters3,random_state42,n_initauto)df[Cluster]kmeans.fit_predict(X_scaled)# 5. 可视化plt.figure(figsize(8,6))sns.scatterplot(datadf,xAnnual Income (k$),ySpending Score (1-100),hueCluster,paletteviridis)plt.title(Customer Segments)# plt.show()# 6. 分析结果print(df)# 簇 0: 低收入高消费 (冲动型)# 簇 1: 低收入低消费 (保守型)# 簇 2: ...五、常见问题Q1K-Means 对初始点敏感吗非常敏感。不同的初始质心可能导致完全不同的聚类结果。Sklearn 的KMeans默认会跑 10 次n_init10每次用不同的初始点然后返回最好的那次结果。Q2数据不是圆形怎么办K-Means 假设簇是凸形的类似圆形对于不规则形状如月牙形效果很差。这时候需要用其他聚类算法如DBSCAN或谱聚类 (Spectral Clustering)。Q3如何处理分类特征K-Means 是基于欧式距离的不能直接处理字符串。需要先将分类特征进行独热编码 (One-Hot)。六、小结无监督学习聚类 ClusteringK-Means1. 随机定 K 个中心2. 分配点到最近中心3. 更新中心到平均值重复 2-3如何选 K?手肘法 (Inertia)轮廓系数 (Silhouette)关键要点K-Means是最简单、最常用的聚类算法。它需要手动指定 K 值并对数据尺度敏感记得标准化。手肘法和轮廓系数是确定 K 值的两大辅助工具。七、课后作业图片颜色聚类读取一张彩色图片将其像素点的 RGB 值作为特征用 K-Means (K8) 进行聚类。然后用每个簇的质心颜色替换该簇所有像素点看看图片变成了什么样主题色提取。DBSCAN查阅 sklearn 文档使用DBSCAN算法处理make_moons月牙形数据集并与 K-Means 的效果进行对比。文本聚类将一堆新闻标题进行 TF-IDF 向量化然后用 K-Means 进行聚类看看能否自动把体育、财经等主题分开。下节预告Day 87机器学习进阶 - PCA 降维- 特征太多了怎么办1000 个维度的特征可能只有 10 个是真正有用的。明天我们学习如何给数据瘦身提取核心特征。系列导航上一篇Day 85 - 支持向量机SVM下一篇Day 87 - PCA降维待更新