创建自己的博客网站,构建中小企业网络,网站ps多大尺寸,企业如何进行品牌推广聚类算法
1 聚类算法简介
1.1 聚类算法介绍
一种典型的无监督学习算法#xff0c;主要用于将相似的样本自动归到一个类别中。
目的是将数据集中的对象分成多个簇#xff08;Cluster#xff09;#xff0c;使得同一簇内的对象相似度较高#xff0c;而不同簇之间的对象相…聚类算法
1 聚类算法简介
1.1 聚类算法介绍
一种典型的无监督学习算法主要用于将相似的样本自动归到一个类别中。
目的是将数据集中的对象分成多个簇Cluster使得同一簇内的对象相似度较高而不同簇之间的对象相似度较低。与分类不同聚类不需要事先给定类别标签算法根据数据本身的特征自动地将数据分组。
在聚类算法中根据样本之间的相似性将样本划分到不同的类别中对于不同的相似度计算方法会得到不同的聚类结果常用的相似度计算方法有欧式距离法。
1.2 聚类算法在现实中的应用
用户画像广告推荐Data Segmentation搜索引擎的流量推荐恶意流量识别基于位置信息的商业推送新闻聚类筛选排序图像分割降维识别离群点检测信用卡异常消费发掘相同功能的基因片段
1.3 聚类算法分类
根据聚类颗粒度分类 细聚类粗聚类
根据实现方法分类
划分聚类按照质心分类主要介绍K-means通用、普遍层次聚类对数据进行逐层划分直到达到聚类的类别个数密度聚类按数据点的密度来形成簇DBSCAN聚类是一种基于密度的聚类算法谱聚类基于图论的聚类算法计算数据点之间的相似度矩阵…
2 聚类API的初步使用
2.1 API介绍
sklearn.cluster.KMeans(n_clusters8) 参数: n_clusters:开始的聚类中心数量 整型缺省值8生成的聚类数即产生的质心centroids数。 方法: estimator.fit(x)estimator.predict(x)estimator.fit_predict(x) 计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)
2.2 API使用
随机创建不同二维数据集作为训练集并结合k-means算法将其聚类你可以尝试分别聚类不同数量的簇并观察聚类效果 创建数据集
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabaz_score# 创建数据集
# X为样本特征Y为样本簇类别 共1000个样本每个样本2个特征共4个簇
# 簇中心在[-1,-1], [0,0],[1,1], [2,2] 簇方差分别为[0.4, 0.2, 0.2, 0.2]
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_state9)# 数据集可视化
plt.scatter(X[:, 0], X[:, 1], markero)
plt.show()使用k-means进行聚类,并使用CH方法评估
y_pred KMeans(n_clusters2, random_state9).fit_predict(X)
# 分别尝试n_cluses2\3\4,然后查看聚类效果
plt.scatter(X[:, 0], X[:, 1], cy_pred)
plt.show()# 用Calinski-Harabasz Index评估的聚类分数
print(calinski_harabasz_score(X, y_pred))3 Kmeans算法流程
3.1 k-means聚类流程 k-means其实包含两层内容 K表示初始中心点个数计划聚类数means求每个类别中样本点的平均值 1、随机设置K个特征空间内的点作为初始的聚类中心
2、对于其他每个点计算到K个中心的距离未知的点选择最近的一个聚类中心点作为标记类别
3、根据每个类别中的样本点重新计算出每个聚类的新中心点平均值
4、如果计算得出的新中心点与原中心点一样质心不再移动那么结束否则重新进行第二步过程
通过下图解释实现流程 k-means聚类动态效果图
4 评价指标
4.1 SSE误差平方和
model.inertia_ K 表示聚类中心的个数簇个数 C_i 表示簇 p 表示样本 m_i表示簇的质心 SSE 越小表示数据点越接近它们的中心聚类效果越好。
缺点SSE通常随着簇数 KKK 的增大而减小因此不能仅仅依赖SSE来评估聚类效果。
4.2 SC轮廓系数 from sklearn.metrics import silhouette_score silhouette_score(X,y_pred) 轮廓系数是用于评估每个数据点与簇内其他点的相似性凝聚度以及与最近簇的相异性分离度的度量。轮廓系数的值在-1到1之间值越大表示聚类效果越好。 其计算过程如下 计算每一个样本 i 到同簇内其他样本的平均距离 ai该值越小说明簇内的相似程度越大 计算每一个样本 i 到最近簇 j 内的所有样本的平均距离 bij该值越大说明该样本越不属于其他簇 j 计算所有样本的平均轮廓系数 轮廓系数的范围为[-1, 1]值越大聚类效果越好
优点轮廓系数能够综合考虑簇的内部一致性和簇之间的分离度不依赖于簇的数量。
4.3 肘部法
肘部法可以用来确定最佳 K 值。 对于n个点的数据集迭代计算 k from 1 to n每次聚类完成后计算 SSE。 SSE 是会逐渐变小的因为每个点都是它所在的簇中心本身。 SSE 变化过程中会出现一个拐点下降率突然变缓时即认为是最佳 n_clusters 值。 在决定什么时候停止训练时肘部法同样有效数据通常有更多的噪音在增加分类无法带来更多回报时我们停止增加类别。
4.4 CH系数 from sklearn.metrics import calinski_harabasz_scorecalinski_harabasz_score(X,y_pred) CH系数结合了聚类的凝聚度Cohesion和分离度Separation、质心的个数希望用最少的簇进行聚类。
CH系数值越大表示聚类效果越好。 SSW 的含义
C_{pi} 表示质心x_i 表示某个样本SSW 值是计算每个样本点到质心的距离并累加起来SSW 表示表示簇内的内聚程度越小越好m表示样本数量k 表示质心个数
SSB 的含义
C_j 表示质心X 表示质心与质心之间的中心点n_j表示样本的个数SSB 表示簇与簇之间的分离度SSB 越大越好
4.5 聚类评估的使用
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score
from sklearn.metrics import calinski_harabasz_scoreif __name__ __main__: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_state9)plt.figure(figsize(18, 8), dpi80)plt.scatter(x[:, 0], x[:, 1], cy)plt.show()estimator KMeans(n_clusters4, random_state0)estimator.fit(x)y_pred estimator.predict(x)# 1. 计算 SSE 值print(SSE:, estimator.inertia_)# 2. 计算 SC 系数print(SC:, silhouette_score(x, y_pred))# 3. 计算 CH 系数print(CH:, calinski_harabasz_score(x, y_pred))5 KMeans算法案例
5.1 案例介绍
已知客户性别、年龄、年收入、消费指数
需求对客户进行分析找到业务突破口寻找黄金客户 数据集共包含顾客的数据, 数据共有 4 个特征, 数据共有 200 条。接下来使用聚类算法对具有相似特征的的顾客进行聚类并可视化聚类结果
5.2 案例实现
确定最佳K值
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score# 聚类分析用户分群
dataset pd.read_csv(data/customers.csv)
dataset.info()
print(dataset--\n, dataset)
X dataset.iloc[:, [3, 4]]
print(X--\n, X)
mysse []
mysscore []
# 评估聚类个数
for i in range(2, 11):mykeans KMeans(n_clustersi)mykeans.fit(X)mysse.append(mykeans.inertia_) # inertia 簇内误差平方和ret mykeans.predict(X)mysscore.append(silhouette_score(X, ret)) # sc系数 聚类需要1个以上的类别
plt.plot(range(2, 11), mysse)
plt.title(the elbow method)
plt.xlabel(number of clusters)
plt.ylabel(mysse)
plt.grid()
plt.show()
plt.title(sh)
plt.plot(range(2, 11), mysscore)
plt.grid(True)
plt.show()通过肘方法、sh系数都可以看出聚成5类效果最好
顾客聚类
dataset pd.read_csv(data/customers.csv)
dataset.head()
X dataset.iloc[:, [3, 4]].values #全部行第四第五列 Annual Income (k$) 和 Spending Score (1-100)
kmeans KMeans(n_clusters 5, init k-means, random_state 42) #k5
y_kmeans kmeans.fit_predict(X)
# 画图展示聚类结果
plt.scatter(X[y_kmeans 0, 0], X[y_kmeans 0, 1], s 100, c red, label Standard)
plt.scatter(X[y_kmeans 1, 0], X[y_kmeans 1, 1], s 100, c blue, label Traditional)
plt.scatter(X[y_kmeans 2, 0], X[y_kmeans 2, 1], s 100, c green, label Normal)
plt.scatter(X[y_kmeans 3, 0], X[y_kmeans 3, 1], s 100, c cyan, label Youth)
plt.scatter(X[y_kmeans 4, 0], X[y_kmeans 4, 1], s 100, c magenta, label TA)
# kmeans.cluster_centers_:聚类后每类的中心点
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s 300, c black, label Centroids)
plt.title(Clusters of customers)
plt.xlabel(Annual Income (k$))
plt.ylabel(Spending Score (1-100))
plt.legend()
plt.show()从图中可以看出聚成5类右上角属于挣的多消费的也多黄金客户群
6 聚类注意点
6.1 样本异常数据
K均值K-Means是聚类中最常用的方法之一它基于点与点距离的相似度来计算最佳类别归属。但K均值在应用之前一定要注意两种数据异常 数据的异常值数据中的异常值能明显改变不同点之间的距离相似度并且这种影响是非常显著的。因此基于距离相似度的判别模式下异常值的处理必不可少。 数据的异常量纲不同的维度和变量之间如果存在数值规模或量纲的差异那么在做距离之前需要先将变量归一化或标准化。例如跳出率的数值分布区间是[01]订单金额可能是[010000000]而订单数量则是[01000]。如果没有归一化或标准化操作那么相似度将主要受到订单金额的影响。
6.2 样本数据量过大
数据量过大的时候不适合使用KMeans算法
K-Means在算法稳定性、效率和准确率相对于真实标签的判别上表现非常好并且在应对大量数据时依然如此。它的算法时间复杂度上界为 n ∗ k ∗ t n*k*t n∗k∗t其中n是样本量、k是划分的聚类数、t是迭代次数。
当聚类数和迭代次数不变时K均值的算法消耗时间只跟样本量有关因此会呈线性增长趋势。
当真正面对海量数据时使用K均值算法将面临严重的结果延迟尤其是当K均值被用做实时性或准实时性的数据预处理、分析和建模时这种瓶颈效应尤为明显。
针对K均值的这一问题很多延伸算法出现了MiniBatchKMeans就是其中一个典型代表。
MiniBatchKMeans使用了一个名为Mini Batch分批处理的方法计算数据点之间的距离。
MiniBatch的好处是计算过程中不必使用所有的数据样本而是从不同类别的样本中抽取一部分样本而非全部样本作为代表参与聚类算法过程。
由于计算样本量少所以会相应减少运行时间但另一方面由于是抽样方法抽样样本很难完全代表整体样本的全部特征因此会带来准确度的下降
经过对30000样本点分别使用KMeans 和 MiniBatchKMeans 进行聚类对比之后运行时间 MiniBatchKMeans 是 K-Means的一半0.17 vs 0.36但聚类结果差异性很小。
**结论**MiniBatchKMeans在基本保持了K-Means原有较高类别识别率的前提下其计算效率的提升非常明显。因此MiniBatchKMeans是一种能有效应对海量数据尽量保持聚类准确性并且大幅度降低计算耗时的聚类算法。