2026/4/17 19:10:53
网站建设
项目流程
信阳网站建设公司,wordpress php 5.3.x,学技能的免费网站,php网站开发演讲稿聚类算法 – 概念
• 什么是聚类算法#xff1f; • 根据样本之间的相似性#xff0c;将样本划分到不同的类别中#xff1b;不同的相似度计算方法#xff0c;会得到不同的聚类结果#xff0c; 常用的相似度计算方法有欧式距离法。 • 聚类算法的目的是在没有先验知识的情…聚类算法 – 概念• 什么是聚类算法• 根据样本之间的相似性将样本划分到不同的类别中不同的相似度计算方法会得到不同的聚类结果 常用的相似度计算方法有欧式距离法。• 聚类算法的目的是在没有先验知识的情况下自动发现数据集中的内在结构和模式。• 无监督学习算法• 使用不同的聚类准则产生的聚类结果不同聚类算法在现实生活中的应用聚类算法分类1.根据聚类颗粒度分类2.根据实现方法分类• K-means按照质心分类主要介绍K-means通用、普遍• 层次聚类对数据进行逐层划分直到达到聚类的类别个数• DBSCAN聚类Density-Based Spatial Clustering of Applications with Noise是一种基于密度的聚类算法• 谱聚类是一种基于图论的聚类算法Calinski-Harabasz 分数也称为方差比准则是一种聚类效果评估指标。值越大聚类效果更好。代码from sklearn.cluster import KMeans import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.metrics import calinski_harabasz_score x, y make_blobs( n_samples1000, n_features2, # 中心点是2维 centers[[-1, -1], [0, 0], [1, 1], [2, 2]], cluster_std[0.4, 0.2, 0.2, 0.2], random_state22 ) # plt.figure(figsize(6, 6)) # plt.scatter(x[:, 0], x[:, 1], cy, marker, cmapviridis, s20) # plt.show() print(x--, x[:3, :]) y_pred KMeans( n_initauto, n_clusters4, random_state40 ).fit_predict(x) plt.figure(figsize(6, 6)) plt.scatter(x[:, 0], x[:, 1], cy_pred, marker, cmapviridis, s20) plt.show() print(calinski_harabasz_score(x, y_pred))执行结果x-- [[-1.61312858 -0.83800844] [-0.7967687 -0.57865695] [ 2.09177616 1.52088834]] 5813.864029456606KMeans算法实现流程1、事先确定常数K 常数K意味着最终的聚类类别数2、随机选择 K 个样本点作为初始聚类中心3、计算每个样本到 K 个中心的距离选择最近的聚类中心点作为标记类别4、根据每个类别中的样本点重新计算出新的聚类中心点平均值如果计算得出的新中心点 与原中心点一样则停止聚类否则重新进行第 2 步过程直到聚类中心不再变化数学计算流程https://blog.csdn.net/qq_35496811/article/details/155610871?spm1001.2014.3001.5502误差平方和SSE (The sum of squares due to error)“肘”方法 (Elbow method) - K值确定• 肘 方法通过 SSE 确定 n_clusters 的值• 对于n个点的数据集迭代计算 k from 1 to n每次聚类完成后计算 SSE• SSE 是会逐渐变小的因为每个点都是它所在的簇中心本身。• SSE 变化过程中会出现一个拐点下降率突然变缓时即认为是最佳 n_clusters值。• 在决定什么时候停止训练时肘形判据同样有效数据通常有更多的噪音在增加分类无法带来更多回报时我们停止增加类别。SC轮廓系数法Silhouette Coefficient轮廓系数法考虑簇内的内聚程度(Cohesion)簇外的分离程度(Separation)。其计算过程如下• 对计算每一个样本 i到同簇内其他样本的平均距离i该值越小说明簇内的相似程度越大• 计算每一个样本 i到最近簇 j 内的所有样本的平均距离 bij该值越大说明该样本越不属于其他簇 j• 根据下面公式计算该样本的轮廓系数• 计算所有样本的平均轮廓系数• 轮廓系数的范围为[-1, 1]聚类效果评估 – CH轮廓系数法Calinski-HarabaszIndexCH 系数考虑簇内的内聚程度、簇外的离散程度、质心的个数•类别内部数据的距离平方和越小越好类别之间的距离平方和越大越好。聚类的种类数越少越好聚类效果评估 – 代码效果展示SSE误差平方和from sklearn.cluster import KMeans import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.metrics import calinski_harabasz_score def dm01(): x, y make_blobs( n_samples1000, n_features2, centers[[-1, -1], [0, 0], [1, 1], [2, 2]], cluster_std[0.4, 0.2, 0.2, 0.2], random_state40 ) sse_list [] for clu_num in range(1, 100): my_kmeans KMeans( n_initauto, n_clustersclu_num, max_iter100, random_state40 ) my_kmeans.fit(x) sse_list.append(my_kmeans.inertia_) # 误差平方和SSE plt.figure(figsize(18, 8), dpi100) plt.xticks(range(0, 100, 3), labelsrange(0, 100, 3)) plt.grid() plt.title(sse) plt.plot(range(1, 100), sse_list, or-) plt.show() dm01()聚类效果评估 – 代码效果展示 – SC系数# 1.导入依赖包 from sklearn.cluster import KMeans import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.metrics import silhouette_score def dm01(): # 2.构建数据产生数据random_state22固定好 x, y make_blobs( n_samples1000, n_features2, centers[[-1, -1], [0, 0], [1, 1], [2, 2]], cluster_std[0.4, 0.2, 0.2, 0.2], random_state22 ) # 3.模型训练及SC系数 tmp_list [] for clu_num in range(2, 100): my_kmeans KMeans( n_initauto, n_clustersclu_num, max_iter100, random_state0 ) my_kmeans.fit(x) ret my_kmeans.predict(x) tmp_list.append(silhouette_score(x, ret)) # SC系数 # 4.效果展示 plt.figure(figsize(18, 8), dpi100) plt.xticks(range(0, 100, 3), labelsrange(0, 100, 3)) plt.grid() plt.title(sc) plt.plot(range(2, 100), tmp_list, ob-) plt.show() dm01()聚类效果评估 – 代码效果展示 – CH系数# 1.导入依赖包 from sklearn.cluster import KMeans import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.metrics import calinski_harabasz_score def dm01(): # 2.构建数据产生数据random_state22固定好 x, y make_blobs( n_samples1000, n_features2, centers[[-1, -1], [0, 0], [1, 1], [2, 2]], cluster_std[0.4, 0.2, 0.2, 0.2], random_state22 ) # 3.模型训练及CH tmp_list [] for clu_num in range(2, 100): my_kmeans KMeans( n_initauto, n_clustersclu_num, max_iter100, random_state0 ) my_kmeans.fit(x) ret my_kmeans.predict(x) tmp_list.append(calinski_harabasz_score(x, ret)) # CH # 4.展示效果 plt.figure(figsize(18, 8), dpi100) plt.xticks(range(0, 100, 3), labelsrange(0, 100, 3)) plt.grid() plt.title(ch) plt.plot(range(2, 100), tmp_list, og-) plt.show() dm01()通过上述3个图片当n_clusters4 取到最大值最佳值4案例顾客数据聚类分析• 已知客户性别、年龄、年收入、消费指数• 需求对客户进行分析找到业务突破口寻找黄金客户• 客户分群效果展示• 代码# 1.导入依赖包 import pandas as pd from sklearn.cluster import KMeans import matplotlib.pyplot as plt from sklearn.metrics import silhouette_score, calinski_harabasz_score # 聚类分析用户分群 def dm01(): # 2.数据读取及预处理 # 2.1 数据读取 dataset pd.read_csv(data/customers.csv) print(dataset.head(2)) # 2.2 特征选择 X dataset.iloc[:, [3, 4]] print(X --\n, X) plt.figure(figsize(8, 6)) plt.scatter(X.iloc[:, 0], X.iloc[:, 1], s50, alpha0.7, edgecolorsw) plt.title(Customer Data Scatter (Annual Income vs Spending Score)) plt.xlabel(X.columns[0]) # Annual Income (k$) plt.ylabel(X.columns[1]) # Spending Score (1-100) plt.grid(True, alpha0.3) plt.show() # 3.模型训练评估聚类个数K值选择 sse_list [] sc_list [] ch_list [] for i in range(2, 20): my_kmeans KMeans( n_initauto, n_clustersi, max_iter100, random_state0 ) my_kmeans.fit(X) ret my_kmeans.predict(X) sse_list.append(my_kmeans.inertia_) # SSE inertia 簇内误差平方和 sc_list.append(silhouette_score(X, ret)) # SC系数 聚类需要1个以上的类别 ch_list.append(calinski_harabasz_score(X, ret)) # CH # 效果展示 plt.figure(figsize(18, 8), dpi100) plt.xticks(range(0, 20, 1), labelsrange(0, 20, 1)) plt.plot(range(2, 20), sse_list, or-) plt.title(sse) plt.xlabel(number of clusters) plt.ylabel(sse) plt.grid() plt.show() plt.plot(range(2, 20), sc_list, ob-) plt.title(sc) plt.grid(True) plt.show() # 4.展示效果 plt.plot(range(2, 20), ch_list, og-) plt.title(ch) plt.grid() plt.show() dm01() def dm02(): # 2.读取数据及数据预处理 dataset pd.read_csv(data/customers.csv) X dataset.iloc[:, [3, 4]] # 3.模型训练及预测 mykeans KMeans(n_clusters5) mykeans.fit(X) y_kmeans mykeans.predict(X) # 4.聚类效果展示 # 把类别是0的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数 plt.scatter(X.values[y_kmeans 0, 0], X.values[y_kmeans 0, 1], s20, cred, labelStandard) # 把类别是1的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数 plt.scatter(X.values[y_kmeans 1, 0], X.values[y_kmeans 1, 1], s20, cblue, labelTraditional) # 把类别是2的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数 plt.scatter(X.values[y_kmeans 2, 0], X.values[y_kmeans 2, 1], s20, cgreen, labelNormal) # 把类别是3的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数 plt.scatter(X.values[y_kmeans 3, 0], X.values[y_kmeans 3, 1], s20, ccyan, labelYouth) # 把类别是4的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数 plt.scatter(X.values[y_kmeans 4, 0], X.values[y_kmeans 4, 1], s20, cmagenta, labelTA) # 每个簇的中心点 plt.scatter(mykeans.cluster_centers_[:, 0], mykeans.cluster_centers_[:, 1], s300, cblack, labelCentroids) plt.title(Clusters of customers) plt.xlabel(Annual Income (k$)) plt.ylabel(Spending Score (1-100)) plt.legend() plt.show() dm02()k 越大簇内举例 (SSW) 越小每个簇样本越少越紧凑k 越大簇间距离 (SSB) 也会变大因为簇被分得更细簇与簇之间距离可能被拉开当 k 继续增加时如果数据本身没有那么多天然簇比如 customers 数据可能只有 4–6 个真实群强行分更多簇会导致簇内距离继续下降因为每个簇样本极少甚至变成单点簇间距离被“人为拉大”分得越细簇间平均距离越大结果CH 分数在某个点后会重新上升形成“假高峰”。结论CH 分数后面变大是过拟合的信号说明 k 已经太大算法开始把噪声当成簇了。