机器学习 | 解析聚类算法在数据检测中的应用

news/2024/5/20 8:02:52 标签: 机器学习, 算法, 聚类, k-means, 人工智能

目录

初识聚类算法

聚类算法实现流程

模型评估

算法优化

特征降维

探究用户对物品类别的喜好细分(实操)


初识聚类算法

聚类算法是一种无监督学习方法,用于将数据集中的对象按照相似性分组。它旨在发现数据中的内在结构和模式,将具有相似特征的数据点聚集到同一组中,并将不同组之间的差异最大化。使用不同的聚类法则,产生的聚类结果也不尽相同:

聚类算法在现实中的应用

1)用户画像,广告推荐,DataSegmentation,搜索引l擎的流量推荐,恶意流量识别

2)基于位置信息的商业推送,新闻聚类,筛选排序

3)图像分割,降维,识别;离群点检测;信用卡异常消费;发掘相同功能的基因片段

聚类算法是无监督的学习算法,而分类算法属于监督的学习算法

接下来我们随机创建不同二维数据集作为训练集,并结合k-means算法将其聚类,尝试分别聚类不同数量的,并观察聚类效果:

首先我们先导入相关使用的第三方库:

import matplotlib.pyplot as plt
from sklearn.datasets._samples_generator import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabasz_score
# n_clusters:开始的聚类中心数量,省值=8,生成的聚类数,即产生的质心(centroids)数。
# estimator.fit_predict(x): 计算聚类心并预测每个样本属于哪个类别,相当于先调用fitx),然后再调用predict(x)

# 创建数据
X, Y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]], cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=9)
# 可视化展示
plt.scatter(X[:, 0], X[:, 1], marker="o")
plt.show()

最终呈现的效果如下所示:

接下来这段代码使用了K-means聚类算法对给定数据集X进行聚类,聚成两个簇:

# KMeans是Scikit-learn库中的K-means聚类算法实现;
# n_clusters=2表示要将数据划分为2个簇;
# n_init=10表示运行算法的次数,以选择最佳结果;
# random_state=9表示随机数生成器的种子,确保结果可以被重复。

# kmeans训练 聚类=2
y_pre = KMeans(n_clusters=2, n_init=10, random_state=9).fit_predict(X)
# 可视化展示
plt.scatter(X[:, 0], X[:, 1], c=y_pre)
plt.show()
# 用ch_scale查看最后效果
print(calinski_harabasz_score(X, y_pre))

呈现的效果如下所示:

接下来我们改变聚类中心的数量得到的结果如下所示: 

聚类算法实现流程

根据上面的案例,我们了解到 K-means 聚类步骤如下:

1)随机设置K个特征空间内的点作为初始的聚类中心

2)对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别

3)接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值),如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步过程:

接下来通过动态图进行演示实现上面的过程:

接下来通过一个案例数据来进行演示:

1)随机设置K个特征空间内的点作为初始的聚类中心(本案例中设置p1和p2):

2)对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别:

3)接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值):

4)如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步过程【经过判断,需要重复上述步骤,开始新一轮迭代】

5)当每次迭代结果不变时,认为算法收敛,聚类完成,K-Means一定会停下,不可能陷入一直选质心的过程。

K-means聚类实现流程总结

1)事先确定常数K,常数K意味着最终的聚类类别数;

2)随机选定初始点为质心,并通过计算每一个样本与质心之间的相似度(这里为欧式距离),将样本点归到最相似的类中,

3)接着,重新计算每个类的质心(即为类中心),重复这样的过程,直到质心不再改变,

4)最终就确定了每个样本所属的类别以及每个类的质心。

注意:由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。

K-means聚类算法优缺点

优点:原理简单(靠近中心点),实现容易;聚类效果中上 (依赖K的选择);空间复杂度o(N),时间复杂度o(IKN)

缺点:对离群点,噪声敏感(中心点易偏移);很难发现大小差别很大的簇及进行增量计算;结果不一定是全局最优,只能保证局部最优(与K的个数及初值选取有关)

模型评估

聚类算法中,模型评估是通过一些内部或外部指标来衡量聚类质量的过程。这些指标可以帮助我们了解聚类模型对数据集的可靠性和有效性。在聚类算法中,有一些常用的模型评估指标,包括SSE(Sum of Squared Errors,误差平方和)、"肘"部法(Elbow Method)、轮廓系数(Silhouette Coefficient,SC)和Calinski-Harabasz指标(CH)。这些指标可以帮助我们选择最佳的聚类数量和评估聚类模型的质量。但需要注意的是,它们仅供参考,具体选择还需结合实际问题和经验。以下是模型评估指数介绍:

SSE:SSE衡量了每个数据点到其所属簇的质心的距离的平方和。SSE越小,表示数据点越接近其所属簇的质心,聚类效果越好。然而,SSE不能直接用于比较不同聚类数量的模型,因为随着聚类数量的增加,SSE通常会减小。

"肘"部法:肘部法是一种通过绘制聚类数量与对应的SSE之间的关系图来选择最佳聚类数量的方法。图形通常呈现出一个弯曲的曲线,在聚类数量逐渐增加时,SSE下降的速度会变缓。选择"肘"部的聚类数量,即找到SSE曲线的拐点,可以认为是最佳的聚类数量。

SC轮廓系数:轮廓系数是一种用于评估聚类结果的紧密度和分离度的指标。它计算每个数据点的轮廓系数,该系数考虑了数据点与其所属簇的距离以及与其他簇的距离。轮廓系数的取值范围在[-1, 1]之间,越接近1表示聚类结果越好。

CH系数:Calinski-Harabasz指标是另一种用于评估聚类结果的指标,它基于簇内方差和簇间方差的比率。较高的Calinski-Harabasz指标表示聚类结果具有较好的紧密度和分离度。

算法优化

通过算法优化,可以改善聚类算法的性能、稳定性和准确性,以更好地发现数据中的结构和模式。以下是几种算法优化的简介:

Canopy算法:将数据点分配到不同的组中,可以有效减少K-means算法计算负担。同时,Canopy算法还可以为K-means算法提供初始质心,并且在保证聚类效果的情况下,可以通过调整T1和T2的值来控制聚类数量。

在给定的所有点中选择其中一个点当作质心,以当前质点为圆心t1为半径画圆,在圆内的点标记为黄色,再以当前质点为圆心t2为半径画圆,把落在圆环内的点加粗,如下:

接下来把圆外的点随机选一个作为圆心继续画圆,操作步骤与上面类似,直到把所有点都包括进去

Canopy算法的优缺点

优点

1)Kmeans对噪声抗干扰较弱,通过Canopy对比,将较小的NumPoint的Cluster直接去掉有利于抗干扰。

2)Canopy选择出来的每个Canopy的centerPoint作为K会更精确。

3)只是针对每个Canopy的内做Kmeans聚类,减少相似计算的数量。

缺点

1)算法中T1、T2的确定问题,依旧可能落入局部最优解

K-means++算法:通过选择合适的初始质心,可以加速K-means算法的收敛速度,减少聚类结果受到初始值的影响,并且在一定程度上提高聚类效果。

如下图中,如果第一个质心选择在圆心,那么最优可能选择到的下一个点在P(A)这个区域(根据颜色进行划分):

二分K-means算法:通过动态地选择聚类数量和质心,可以避免K-means算法陷入局部最优解,并且在一定程度上提高聚类效果。

实现流程:

1)所有点作为一个簇。

2)将该簇一分为二。

3)择能最大限度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。

4)以此进行下去,直到簇的数目等于用户给定的数目k为止。

因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点越接近于他们的质心,聚类效果就越好。所以需要对误差平方和最大的簇进行再一次划分,因为误差平方和越大,表示该簇聚类效果越不好,越有可能是多个簇被当成了一个簇,所以我们首先需要对这个簇进行划分。 

二分K均值算法可以加速K-means算法的执行速度,因为它的相似度计算少了并且不受初始化问题的影响,因为这里不存在随机点的选取,且每一步都保证了误差最小。

K-medoids算法:通过选择代表性对象作为质心,可以避免出现非数据点的质心,从而提高聚类结果的可解释性。同时,选择medoid作为质心可以减少聚类结果受到异常值的影响。

特征降维

特征降维是指通过某种数学变换或算法,将原始数据集中的高维特征转化为低维表示的过程。在机器学习和数据分析中,特征降维可以帮助减少数据集的维度,提取最具代表性的特征,去除冗余信息,并且有助于可视化和理解数据。

降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程:

降维有两种方式 :特征选择和主成分分析(特征提取的方式),以下进行讲解:

特征选择:数据中包含余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。其对应的方法如下:

低方差特征过滤:通过如下代码进行演示:

最终呈现的效果如下:

其相关系数的主要实现方式有 皮尔逊相关系数和斯皮尔曼相关系数:

皮尔逊相关系数:反映变量之间相关关系密切程度的统计指标

其案例实现的代码如下:

from scipy.stats import pearsonr

def pea_demo():
    # 准备数据
    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)

pea_demo()

最终呈现的效果如下所示:

斯皮尔曼相关系数:反映变量之间相关关系密切程度的统计指标

其案例实现的代码如下:

from scipy.stats import spearmanr

def pea_demo():
    # 准备数据
    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)

pea_demo()

最终呈现的效果如下所示:

主成分分析

定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量。

作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

应用:回归分析或者聚类分析当中。

这里拿一个简单的数据进行测试一下:

from sklearn.decomposition import PCA

def pca_demo():
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
    # pca小数保留百分比
    transfer = PCA(n_components=0.9)
    trans_data = transfer.fit_transform(data)
    print("保留0.9的数据最后维度为: \n", trans_data)

    # pca小数保留百分比
    transfer = PCA(n_components=3)
    trans_data = transfer.fit_transform(data)
    print("保留三列数据最后维度为: \n", trans_data)

pca_demo()

最终呈现的效果如下所示:

探究用户对物品类别的喜好细分(实操)

接下来通过kaggle平台中的:竞赛 中的一道题目:应用 PCA 和 K-means 实现用户对物品类别的喜好细分划分,来加强我们聚类算法的学习:

数据集当中对应的数据如下:

根据竞赛提供的信息:

得到的最终结果需求是:

接下来我们开始正式对竞赛题目开始操作,以下是项目操作的具体步骤:

获取数据

数据基本处理

交叉表(Cross Tabulations)是一种常用的分类汇总表格,用于频数分布统计,主要价值在于描述了变量间关系的深刻含义。它可以计算两个(或更多)因子的简单交叉表。默认情况下,它会计算因子的频率表,除非传递了值数组和聚合函数。 

特征工程

机器学习(K-means聚类)

模型评估


http://www.niftyadmin.cn/n/5364395.html

相关文章

移动云ONAIR媒体云全解读!媒体内容数字化融合一站式解决方案

当下,传统媒体面临着诸多挑战,如何利用信息技术提升内容的质量、形式和分发效率,成为媒体行业的迫切需求。移动云作为数字中国建设的“主力军”, 立足于新兴媒体与云计算市场的变化与需求,推出了ONAIR 媒体云解决方案&…

LabVIEW与EtherCAT实现风洞安全联锁及状态监测

LabVIEW与EtherCAT实现风洞安全联锁及状态监测 在现代风洞试验中,安全联锁与状态监测系统发挥着至关重要的作用,确保了试验过程的安全性与高效性。介绍了一套基于EtherCAT总线技术和LabVIEW软件开发的风洞安全联锁及状态监测系统。该系统通过实时、可靠…

静态住宅代理IP在网络营销中的作用

随着互联网的普及,网络营销在当今商业社会中扮演着重要的角色。为了提高网络营销的效果,一种被广泛应用的策略是使用静态住宅代理IP。本文将探讨静态住宅代理在网络营销中的作用,并分析其优势和方法。 我们来了解一下静态住宅代理IP的概念。…

使用django构建一个多级评论功能

,评论系统是交流和反馈的重要工具,尤其是多级评论系统,它允许用户回复特定评论,形成丰富的对话结构。这个文章是使用Django框架从零开始构建一个多级评论系统。Django是一个高级Python Web框架,它鼓励快速开发和干净、…

go消息队列RabbitMQ - 订阅模式-fanout

1、发布订阅 订阅模式,消息被路由投递给多个队列,一个消息被多个消费者获取。 1) 可以有多个消费者 2) 每个消费者有自己的queue(队列) 3) 每个队列都要绑定到Exchange(交换机&…

大数据 - Spark系列《三》- 加载各种数据源创建RDD

Spark系列文章: 大数据 - Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 目录 3.1🧀加载文件(本地) 1. 加载本地文件路径 🌮使用te…

json、jsonlines格式化显示

一、对于vscode暂时没找到合适的方法来格式化 二、利用JetBrains的IDE(例如PyCharm)来格式化(快捷键CtrlAltL) 三、利用jq工具:(速度快,推荐。) # 安装 sudo apt install jq# 使用(假设你已经有一个dev.jsonlines文件) jq . dev.…

用Matlab 2015a svmtrain函数训练的SVM model在2021b无法使用的解决方法

背景 与r2015a版本的Matlab相比,r2021b版本中包含更多集成好的算法模块(尤其是深度学习的模块),想把原来r2015a版本的代码升级到r2021b高版本的Matlab已经采用fitcsvm函数和predict函数替代了旧版本中svmtrain函数和svmclassify函…