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

news2024/11/29 6:37:23

目录

初识聚类算法

聚类算法实现流程

模型评估

算法优化

特征降维

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


初识聚类算法

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

聚类算法在现实中的应用

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.coloradmin.cn/o/1432449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Photoshop CS6 下载安装教程,保姆级教程,小白也能轻松搞的,附安装包

前言 Adobe Photoshop CS6强大的照片拍摄和突破性的新功能,用于复杂的图形、选择、逼真的绘画和装饰智能。创建惊人的高动态范围(HDR)图像。用逼真的笔触和混合的颜色绘画。消除噪音,添加种子,并绘制一个国家最先进的摄影设备的草图。凭借原…

【HarmonyOS应用开发】ArkUI 开发框架-进阶篇-Video组件的使用(十)

一、Video组件的使用 1、概述 在手机、平板或是智慧屏这些终端设备上,媒体功能可以算作是我们最常用的场景之一。无论是实现音频的播放、录制、采集,还是视频的播放、切换、循环,亦或是相机的预览、拍照等功能,媒体组件都是必不可…

MacBook有必要装清理软件吗?CleanMyMac的一些主要特点

MacBook是苹果公司的一款高端笔记本电脑,但是,随着使用时间的增长,MacBook也会出现一些问题,比如运行缓慢、卡顿、垃圾文件堆积、磁盘空间不足等。这些问题不仅影响了用户的使用体验,也可能对MacBook的寿命和安全性造成…

Shell脚本⑧免交互

目录 一.Here Document 1.定义 2.变量 (1)变量替换成实际值 (2)整行内容作为变量并输出结果 (3)多行注释 (4)自动划分磁盘免交互 二.Expect 1.定义 2.安装 3.免交互操作 …

django线上教育学习平台大数据分析系统python

随着互联网技术不断地发展,网络与大数据成为了人们生活的一部分,而线上教育平台大数据分析作为网上应用的一个全新的体现,由于其特有的便捷性,已经被人们所接受。目前主流的线上教育平台大数据分析服务不仅不明确并且管理盈利较低…

基于STM32的UART/USART数据传输的错误检测和纠错机制研究

在STM32微控制器中,UART/USART模块的数据传输可以通过错误检测和纠错机制来提高数据的可靠性。下面将介绍一些常用的错误检测和纠错机制,并提供一个示例代码来演示如何使用这些机制。 ✅作者简介:热爱科研的嵌入式开发者,修心和技…

SpringCloud-微服务概述、SpringCloud入门概述、服务提供与消费

1.学习前言 1.1 学习前提 熟练使用SpringBoot 微服务快速开发框架了解过Dubbo Zookeeper 分布式基础电脑配置内存不低于8G 1.2 文章大纲 Spring Cloud 五大组件 服务注册与发现——Netflix Eureka负载均衡: ​ 客户端负载均衡——Netflix Ribbon ​ 服务端负载…

Oracle喊你领取免费AI 助理级证书啦!

拿证秘籍如下: 1. 登录Oracle的考试中心网站:https://education.oracle.com/certification 2. 选择AI 助理级考试,考试代码:1Z0-1122-23,也可以点击这里直达 3. AI学习视频免费看,也可以选择不看 3.5 去…

一台机器上如何部署多个web项目

1、综述 随着计算机硬件水平的不断提高,往往不是一台机器上只部署一个web项目了,而是尽可能多部署几个项目,以用来节省资源,现在我们看看如何一台机器部署多个项目,我们先结合上一篇文章中提到的tomcat架构&#xff0…

重温《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)》 –– 学习笔记(二)

第二部分:自动内存管理机制 第2章:Java内存区域与内存溢出异常 2.1 概述 Java 与 C 之间有一堵由内存动态分配和垃圾收集技术围成的高墙。 Java 程序员在 虚拟机自动内存管理机制 的帮助下,无需为每一个 new 操作去写配对的 delete/free …

TOP100-链表(四)

9.24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2…

myql 项目数据库和表的设计

1.表的设计和创建 2.在navicate运行这些代码 create table user(id int not null auto_increment primary key,name varchar(50) not null unique,password varchar(50) not null,state enum(online,offline) default offline ); create table friend(userid int not null,…

java之ReentrantLock

在讲RentrantLock之前需要先讲一下AQS和LockSupport,因为rentrantLock底层是用AQS实现的,而AQS中获取阻塞和唤醒底使用LockSupport实现的。 1、LockSupport实现 下面代码中,LockSupport.park方法是当前线程等待,直到获得许可&am…

06:原生云K8S解密|K8S集群安装部署|K8S网络插件

原生云K8S解密|K8S集群安装部署|K8S网络插件 K8SK8S集群架构图解 K8S部署仓库初始化kube-master安装计算节点的安装token管理 配置flannel网络(master主机操作) K8S 有大量夸主机的容器需要管理,快速部署应用&#xff…

问题:根据全面推进国防和军队现代化的战略安排,_____把人民军队全面建成世界一流军队。 #经验分享#媒体

问题:根据全面推进国防和军队现代化的战略安排,_____把人民军队全面建成世界一流军队。 A、2020年 B、2035年 C、本世纪中叶 D、2045年 参考答案如图所示 问题:判断题:高处作业传递物件应使用绳索,在确认作业下方…

面试数据结构与算法总结分类+leetcode目录【基础版】

🧡🧡🧡算法题目总结: 这里为大家总结数据结构与算法的题库目录,如果已经解释过的题目会标注链接更新,方便查看。 数据结构概览 Array & String 大家对这两类肯定比较清楚的,同时这也是面试…

C#,雅各布斯塔尔—卢卡斯(Jacobsthal Lucas Number)的算法与源代码

1 雅各布斯塔尔序列 雅各布斯塔尔序列是一个与斐波那契序列类似的加法序列,由递归关系JnJn-12Jn-2定义,初始项J00,J11。序列中的一个数字称为雅可布沙尔数。它们是卢卡斯序列Un(P,Q)的一种特殊类型&#x…

【stm32】hal库学习笔记-ADC模数转换(超详细!)

【stm32】hal库学习笔记-ADC模数转换(超详细!) 本篇章介绍了ADC实现电压检测的三种方式 ADC原理及选型 ADC将连续的模拟电压信号转换为二进制的数字信号 选型参数 速度(采样频率) 功耗 精度 转换原理 ADC hal库驱…

redis的缓存击穿和缓存雪崩和缓存穿透问题解决方法

Redis的缓存击穿: 热点的key,在不停的扛着大并发,当这个key失效时,一瞬间大量的请求冲到持久层的数据库中,就像在一堵墙上某个点凿开了一个洞! 解决方法: 1.热点key永不过期: 统计访…

【vue3学习P5-P10】vue3语法;vue响应式实现

0、vue2和vue3对比 框架版本API方式双向绑定原理domFragmentsTree-Shakingvue2选项式API(Options API)基于Object.defineProperty(监听)实现,不能双向绑定对象类型的数据【通过Object.defineProperty里面的set和get做…