聚类算法简介
聚类算法是一种无监督学习算法,主要用于将相似的样本自动归到一个类别中。它通过分析样本之间的相似性,将样本划分到不同的类别中,从而发现数据中的内在结构和模式。
应用:市场分析、用户画像、广告推荐、图像分割等。
聚类算法与分类算法的区别
- 学习方式不同:
- 聚类算法是一种无监督学习算法,它不需要事先知道数据的类别标签。
- 分类算法是一种监督学习算法,它需要事先知道数据的类别标签,并通过训练学习如何将新数据正确分类
- 对源数据集要求不同:
- 聚类算法对源数据集没有特别的要求,可以是无标签的数据集。
- 分类算法要求源数据集包含标签信息,以便训练模型。
- 应用场景不同:
- 聚类算法更多地应用于数据探索性分析、数据降维、数据压缩等过程性分析和处理。
- 分类算法更多地应用于预测性分析和使用。
聚类算法api
sklearn.cluster.KMeans
通过迭代的方式将数据点划分为K个簇,使得每个簇内的点尽可能相似,而不同簇的点尽可能不同。KMeans算法的目标是找到数据集的K个簇,并使得每个数据点到其所属簇的质心的距离平方和最小。
流程
KMeans算法的流程大致如下:
- 初始化:随机选择K个数据点作为初始的簇质心。
- 分配:对于数据集中的每个点,计算其与各个簇质心的距离,并将其分配到最近的簇质心所在的簇中。
- 更新:重新计算每个簇的质心,通常是通过计算簇内所有点的均值来得到新的质心。
- 迭代:重复步骤2和步骤3,直到满足某种停止条件(如质心不再发生变化或达到预设的迭代次数)。
优点
- 简单易懂:算法原理简单,容易理解和实现。
- 高效处理:对于大数据集,KMeans能够快速完成聚类。
- 可伸缩性:适用于不同规模的数据集。
- 明确划分:聚类结果清晰,每个簇内部数据相似度高。
- 可并行化:支持并行计算,提高处理速度。
缺点
- 初始敏感:聚类结果受初始聚类中心选择影响大。
- K值难定:需要预先指定聚类数K,选择不当会影响聚类效果。
- 形状限制:假设簇是球形或椭球形,对非凸形状数据聚类效果不佳。
- 噪声敏感:对噪声和异常值敏感,可能影响聚类准确性。
- 局部最优:可能陷入局部最优解,而非全局最优。
代码示例:
from matplotlib import pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs from sklearn.metrics import calinski_harabasz_score #创建数据集 # X为样本特征,Y为样本簇类别,共1000个样本,每个样本4个特征,共4个膜, #簇中心在[-1,-1],[0,0],[1,1],[2,2],蔟方差分别为10.4,0.2,0.2,0.2] x,y = make_blobs(n_samples=1000,n_features=2, centers=[[-1,-1],[0,0],[1,1],[2,211]], cluster_std=[0.4,0.2,0.2,0.2], random_state=9) #数据集可视化 plt.scatter(x[:, 0], x[:, 1], marker='0') plt.show() # 2.使用k-means进行聚类,并使用CH方法评估 y_pred =KMeans(n_clusters=2,random_state=9).fit_predict(x) #分别尝试n_cluses=2\3\4,然后查看聚类效果 plt.scatter(x[:, 0], x[:, 1], c=y_pred) plt.show() #用Calinski-Harabasz Index评估的聚类分数 print(calinski_harabasz_score(x, y_pred)) # 3.使用k-means进行聚类,并使用CH方法评估 y_pred =KMeans(n_clusters=3,random_state=9).fit_predict(x) #分别尝试n_cluses=2\3\4,然后查看聚类效果 plt.scatter(x[:, 0], x[:, 1], c=y_pred) plt.show() #用Calinski-Harabasz Index评估的聚类分数 print(calinski_harabasz_score(x, y_pred))
参数介绍
sklearn.cluster.KMeans
的主要参数包括:
- n_clusters:整型,默认值为8。表示要形成的簇的个数,即质心的数量。
- init:字符串或可调用对象,默认为'k-means++'。用于选择初始质心,以加速算法的收敛速度。
- n_init:整型,默认为10。表示算法运行的次数,每次运行都会使用不同的初始质心进行聚类,并选取最好的结果作为最终输出。这有助于避免算法陷入局部最优解。
- max_iter:整型,默认为300。表示算法的最大迭代次数。如果算法在达到最大迭代次数之前还没有收敛,则会停止迭代。
- tol:浮点型,默认为1e-4。表示算法收敛的阈值。如果两次迭代之间的质心变化小于这个阈值,则认为算法已经收敛,可以提前停止迭代。
- random_state:用于控制随机数的生成,以便算法的结果可以复现。
此外,sklearn.cluster.KMeans
还提供了fit
、predict
和fit_predict
等方法,用于训练模型、预测新数据点的簇标签以及同时训练模型并预测簇标签。
模型评估
1. SSE(误差平方和)
定义:SSE是计算每个数据点到其所属簇中心的距离的平方和。
在k-means聚类中,SSE的值越小,表示数据点与其簇中心的距离越近,聚类效果越好。
2. 肘部法(Elbow Method)
定义:通过迭代计算不同k值下的SSE,并绘制成曲线图,观察曲线的“肘点”来确定k值。
- 当SSE的减小速度突然变缓时,这个点就被称为“肘点”,它通常指示了最佳的簇数量。
3. SC系数(轮廓系数,Silhouette Coefficient)
其取值范围为[-1, 1],值越大表示聚类效果越好。
4. CH系数(Calinski-Harabasz Index)
定义:CH系数通过计算簇内样本的紧密程度和簇间样本的分离程度来评估聚类效果。其值越大表示聚类效果越好。
优化算法
1. Canopy + K-means
原理:
- Canopy算法:Canopy算法不需要事先指定聚类数量K,它通过两个距离阈值T1和T2(T1 > T2)来定义点与Canopy之间的关系。
- K-means算法:使用Canopy算法得到的Canopies作为初始聚类中心,进行精细的聚类。
优点:
- 执行速度快(先进行了一次聚簇中心点选择的预处理)。
- 不需要给定K值,应用场景多。
- 能够缓解K-Means算法对于初始聚类中心点敏感的问题。
2. K-means++
原理:
K-means++算法首先随机选择一个样本点作为第一个聚类中心,然后对于数据集中的每个点,计算它到已选聚类中心的最短距离,并根据距离的平方成正比的概率选择下一个聚类中心。重复此过程直到选择了K个聚类中心。
优点:
- 减少了初始聚类中心选择的随机性,提高了算法的稳定性。
- 倾向于在数据集的不同区域选择聚类中心,避免了偏斜聚类中心的问题。
3. 二分K-means
原理:
- 将所有样本数据作为一个簇放到一个队列中。
- 从队列中选择一个簇进行K-means算法划分,划分为两个子簇,并将子簇添加到队列中。
- 循环迭代此过程,直到达到预设的聚簇数量、最小平方误差或迭代次数等中止条件。
优点:
- 弱化了初始聚类中心的影响,提高了算法的稳定性。
- 可以逐步逼近最优解。
二、其他聚类算法
1. K-medoids(K中值聚类)
原理:
与K-means算法相似,但每个簇的中心是一个实际的数据点(medoid),而不是均值点。算法目标是选择K个数据点作为簇中心,使得每个数据点到其所属簇中心的距离之和最小化。
优点:
- 对噪声和离群点具有较好的鲁棒性。
- 簇中心更具代表性,可解释性强。
2. Kernel K-means
原理:
在数据点被映射到高维特征空间后执行K-means算法。通过核函数将数据映射到高维空间,以发现更复杂的结构和模式。
优点:
- 能够处理非线性关系的数据。
- 可能发现传统K-means无法发现的聚类结构。
3. ISODATA(迭代自组织数据分析技术)
原理:
ISODATA是一种动态的聚类算法,它可以根据聚类结果自动调整聚类数量和聚类中心。算法在迭代过程中会根据设定的分裂阈值和合并阈值来分裂或合并簇。
优点:
- 能够自动调整聚类数量和聚类中心。
- 适用于数据分布不均匀或聚类数量未知的情况。
4. Mini-batch K-means
原理:
Mini-batch K-means是K-means算法的一种优化变种,它使用数据集的随机子集来更新聚类中心,以减少计算时间。算法在每次迭代中仅处理数据集的一小部分,然后更新聚类中心。
优点:
- 显著减少了计算时间。
- 产生的聚类结果效果与标准K-means算法相近。
特征工程-特征降维简介
特征降维是指通过减少特征空间中的维度,将高维数据映射到一个低维子空间的过程。特征降维主要分为两种主要方法:特征选择和特征提取。
方法
1. 特征选择(Filter)
特征选择是指从原始特征中选择一部分最具有代表性和重要性的特征子集,忽略其他特征。这样可以减少特征的数量,从而降低维度。
过滤法(Filter Methods):
- 方差选择法:计算各个特征的方差,然后根据阈值选择方差大于阈值的特征。方差选择法认为特征取值越集中的特征,其包含的信息越少。
- 相关系数:通过计算特征与目标值之间的相关系数,选择相关性较高的特征。常用的相关系数包括皮尔逊相关系数和斯皮尔曼相关系数。
2. 特征提取(Embedded)
特征提取是通过数学变换将原始特征映射到一个新的低维子空间,从而保留数据中的关键信息。通过线性或非线性的映射,将高维数据转化为低维表示,使得新特征具有更强的表达能力。
低方差特征过滤
低方差特征过滤是一种简单的特征选择方法,通过删除方差很小的特征来减少数据的维度。
相关系数
皮尔逊相关系数(Pearson Correlation Coefficient)
皮尔逊相关系数用于度量两个变量之间的线性相关程度。其值介于-1与+1之间,其中:
- 当r > 0时,表示两变量正相关;
- 当r < 0时,表示两变量负相关;
- 当|r| = 1时,表示两变量为完全相关;
- 当r = 0时,表示两变量间无相关关系。
斯皮尔曼相关系数(Spearman Correlation Coefficient)
斯皮尔曼相关系数用于度量两个变量的依赖程度,是非参数度量,对数据的分布没有要求。其取值范围也在-1与+1之间,与皮尔逊相关系数类似。
代码案例:
import pandas as pd from scipy.stats import pearsonr, spearmanr from sklearn.feature_selection import VarianceThreshold def var_thr( ): """ 特征选择:低方差特征过滤 :return: """ data = pd.read_csv("./data/factor_returns.csv") # print(data) print(data.shape) #实例化一个对象 transfer =VarianceThreshold(threshold=10)#转换 transfer_data = transfer.fit_transform(data.iloc[:,1:10]) print(transfer_data) print(data.iloc[:,1:10].shape) print(transfer_data.shape) def pea_demo(): """ 皮尔逊相关系数: :return: """ # 准备数据 x1 = [12.5,15.3,23.2,26.4,33.5,34.4,39.4,45.2,55.4,60.9] x2 = [21.2,23.9,32.9,34.1,42.5,43.2,49.0,52.8,59.4,63.5] # 判断 ret = pearsonr(x1, x2) print("皮尔逊相关系数的结果是:\n",ret) def spea_demo(): """ 斯皮尔曼相关系数: :return: """ # 准备数据 x1 = [12.5,15.3,23.2,26.4,33.5,34.4,39.4,45.2,55.4,60.9] x2 = [21.2,23.9,32.9,34.1,42.5,43.2,49.0,52.8,59.4,63.5] # 判断 ret = spearmanr(x1, x2) print("斯皮尔曼相关系数的结果是:\n",ret) if __name__ =='__main_': # var_thr() # pea_demo() spea_demo()