结合PCA降维的DBSCAN聚类方法(附Python代码)
目录
前言介绍:
1、PCA降维:
(1)概念解释:
(2)实现步骤:
(3)优劣相关:
2、DBSCAN聚类:
(1)概念解释:
(2)算法原理:
(3)优劣相关:
代码实现:
0、数据准备:
1、PCA降维:
2、DBSCAN聚类:
3、代码汇总:
实现效果:
1、降维效果:
2、聚类效果:
写在最后:
前言介绍:
1、PCA降维:
(1)概念解释:
PCA,全称Principal Component Analysis,即主成分分析。是一种降维方法,实现途径是提取特征的主要成分,从而在保留主要特征的情况下,将高维数据压缩到低维空间。
在经过PCA处理后得到的低维数据,其实是原本的高维特征数据在某一低维平面上的投影(只要维度较低,都可以视为平面,例如三维相对于四维空间也可以视为一个平面)。虽然降维的数据能够反映原本高维数据的大部分信息,但并不能反映原本高维空间的全部信息,因此要根据实际情况,加以鉴别使用。
(2)实现步骤:
PCA主要通过6个步骤加以实现:
1、标准化(将原始数据进行标准化,一般是去均值,如果特征在不同量级上,还要将矩阵除以标准差)
具体:
其中,E为原始矩阵,Emean为均值矩阵,Enorm为标准化矩阵。
2、协方差(计算标准化数据集的协方差矩阵)
具体:
其中,Cov为协方差矩阵,m为样本的数量,Enorm为均值矩阵。
3、特征值(计算协方差矩阵的特征值和特征向量)
具体:
假设实数λ、n行(原始矩阵E的列数即为n)1列的矩阵X(即n维向量)满足下式:
则λ为Cov的特征值,其中Cov为协方差矩阵。
4、K 特征(保留特征值最大的前K个特征(K是降维后,我们期望达到的维度))
具体:
若有多个特征值,则保留前K个最大的特征值,以满足之后的计算需求。
5、K 向量(找到这K个特征值对应的特征向量)
具体:
通过步骤3中的公式得到每个特征值对应的特征向量。
6、得降维(将标准化数据集乘以该K个特征向量,得到降维后的结果)
具体:
其中,Epca为最后要求得的PCA降维矩阵,Enorm为标准化矩阵,X1、X2、X3、...、Xk为对K个特征值对应的特征向量。
(3)优劣相关:
优点:
1.PCA降维之后的各个主成分之间相互正交,可消除原始数据之间相互影响的因素。
2.PCA降维的计算过程并不复杂,因实现起来较简单容易。
3.在保留大部分主要信息的前提下,起到了降维,简便化计算效果。
缺点:
1.特征主成分的定义具有模糊性,解释性差。
2.PCA降维选取令原数据在新坐标轴上方差最大的主成分的标准,使得一些方差小的特征较易丢失,有损失重要信息的可能性。
2、DBSCAN聚类:
(1)概念解释:
密度聚类亦称“基于密度的聚类”(Density-Based Clustering),此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连续性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)就是这样一种聚类算法,该算法基于一组“领域”(neighborhood)参数(ε,MinPts)来刻画样本分布的紧密程度。
(2)算法原理:
给定数据集D={x1,x2,...,xm},定义下面这几个概念:
理解了相关概念之后,下面给出算法实现的伪代码:
(3)优劣相关:
优点:
1、能够识别任意形状的样本。
2、该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇。
3、无需指定簇个数,而是由算法自主发现。
缺点:
1、需要指定最少点个数(MinPts)与半径(ε)。(但其实相对其他聚类算法来说,已经具有较大的自由性。)
2、最少点个数与半径对算法的影响较大,一般需多次调试。
代码实现:
0、数据准备:
在这里,我们使用sklearn库的鸢尾花iris数据集(sklearn.datasets.load_iris)作为测试数据样本。iris数据集包含150个样本,每个样本包含四个属性特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和一个类别标签(分别用0、1、2表示山鸢尾、变色鸢尾和维吉尼亚鸢尾)。
首先,我们要安装sklearn库。安装此库,还是通过pip install命令,但是并不是pip install sklearn,而是pip install scikit-learn。正如我们调用opencv是import cv2,而安装却是通过pip install opencv一样。
pip install scikit-learn
然后,获取数据集,其中x为鸢尾花的特征数据集(数据类型为数组numpy.adarray),y为鸢尾花的标签数据集(数据类型为数组numpy.adarray) 。
from sklearn.datasets import load_iris
x = load_iris().data
y = load_iris().target
1、PCA降维:
import numpy as npdef PCA_DimRed(dataMat,topNfeat): #PCA_DimRed--PCA dimension reduction,PCA降维meanVals = np.mean(dataMat, axis=0)meanRemoved = dataMat - meanVals # 标准化(去均值)covMat = np.cov(meanRemoved, rowvar=False)eigVals, eigVets = np.linalg.eig(np.mat(covMat)) # 计算矩阵的特征值和特征向量eigValInd = np.argsort(eigVals) # 将特征值从小到大排序,返回的是特征值对应的数组里的下标eigValInd = eigValInd[:-(topNfeat + 1):-1] # 保留最大的前K个特征值redEigVects = eigVets[:, eigValInd] # 对应的特征向量lowDDatMat = meanRemoved * redEigVects # 将数据转换到低维新空间# reconMat = (lowDDatMat * redEigVects.T) + meanVals # 还原原始数据return lowDDatMat
2、DBSCAN聚类:
import numpy as np
import random
import copydef DBSCAN_cluster(mat,eps,min_Pts): #进行DBSCAN聚类,优点在于不用指定簇数量,而且适用于多种形状类型的簇k = -1neighbor_list = [] # 用来保存每个数据的邻域omega_list = [] # 核心对象集合gama = set([x for x in range(len(mat))]) # 初始时将所有点标记为未访问cluster = [-1 for _ in range(len(mat))] # 聚类for i in range(len(mat)):neighbor_list.append(find_neighbor(mat, i, eps))if len(neighbor_list[-1]) >= min_Pts:omega_list.append(i) # 将样本加入核心对象集合omega_list = set(omega_list) # 转化为集合便于操作while len(omega_list) > 0:gama_old = copy.deepcopy(gama)j = random.choice(list(omega_list)) # 随机选取一个核心对象k = k + 1Q = list()Q.append(j)gama.remove(j)while len(Q) > 0:q = Q[0]Q.remove(q)if len(neighbor_list[q]) >= min_Pts:delta = neighbor_list[q] & gamadeltalist = list(delta)for i in range(len(delta)):Q.append(deltalist[i])gama = gama - deltaCk = gama_old - gamaCklist = list(Ck)for i in range(len(Ck)):cluster[Cklist[i]] = komega_list = omega_list - Ckreturn cluster
3、代码汇总:
from sklearn.datasets import load_iris
import numpy as np
import random
import copy
import matplotlib.pyplot as pltdef PCA_DimRed(dataMat,topNfeat): #PCA_DimRed--PCA dimension reduction,PCA降维meanVals = np.mean(dataMat, axis=0)meanRemoved = dataMat - meanVals # 标准化(去均值)covMat = np.cov(meanRemoved, rowvar=False)eigVals, eigVets = np.linalg.eig(np.mat(covMat)) # 计算矩阵的特征值和特征向量eigValInd = np.argsort(eigVals) # 将特征值从小到大排序,返回的是特征值对应的数组里的下标eigValInd = eigValInd[:-(topNfeat + 1):-1] # 保留最大的前K个特征值redEigVects = eigVets[:, eigValInd] # 对应的特征向量lowDDatMat = meanRemoved * redEigVects # 将数据转换到低维新空间# reconMat = (lowDDatMat * redEigVects.T) + meanVals # 还原原始数据return lowDDatMatdef find_neighbor(data,pos,eps): #寻找相邻点函数N = list()temp = np.sum((data-data[pos])**2, axis=1)**0.5N = np.argwhere(temp <= eps).flatten().tolist()return set(N)def DBSCAN_cluster(data,eps,min_Pts): #进行DBSCAN聚类,优点在于不用指定簇数量,而且适用于多种形状类型的簇,如果使用K均值聚类的话,对于这次实验的数据(条状簇)无法得到较好的分类结果k = -1neighbor_list = [] # 用来保存每个数据的邻域omega_list = [] # 核心对象集合gama = set([x for x in range(len(data))]) # 初始时将所有点标记为未访问cluster = [-1 for _ in range(len(data))] # 聚类for i in range(len(data)):neighbor_list.append(find_neighbor(data, i, eps))if len(neighbor_list[-1]) >= min_Pts:omega_list.append(i) # 将样本加入核心对象集合omega_list = set(omega_list) # 转化为集合便于操作while len(omega_list) > 0:gama_old = copy.deepcopy(gama)j = random.choice(list(omega_list)) # 随机选取一个核心对象k = k + 1Q = list()Q.append(j)gama.remove(j)while len(Q) > 0:q = Q[0]Q.remove(q)if len(neighbor_list[q]) >= min_Pts:delta = neighbor_list[q] & gamadeltalist = list(delta)for i in range(len(delta)):Q.append(deltalist[i])gama = gama - deltaCk = gama_old - gamaCklist = list(Ck)for i in range(len(Ck)):cluster[Cklist[i]] = komega_list = omega_list - Ckreturn clusterif __name__ == "__main__":#1、准备数据x = load_iris().datay = load_iris().target#2、PCA降维pro_data = PCA_DimRed(x,2)#3、DBSCAN聚类(此步中要保证数据集类型为数组,以配合find_neighbor函数)pro_array = np.array(pro_data)thecluster = DBSCAN_cluster(pro_array,eps=0.8,min_Pts=30)#4、展示降维效果:print("下面是降维之前的鸢尾花数据集特征集:")print(x)print("下面是降维之后的鸢尾花数据集特征集:")print(pro_data)#5、展示聚类效果:plt.figure()plt.scatter(pro_array[:, 0], pro_array[:, 1], c=thecluster)plt.show()
实现效果:
1、降维效果:
降维之前的鸢尾花数据集特征集:
降维之后的鸢尾花数据集特征集:
2、聚类效果:
可以看出来,DBSCAN聚类方法并不能很准确地根据PCA降维后的鸢尾花特征集对鸢尾花样本进行聚类,原因是变色鸢尾与维吉尼亚鸢尾的样本特征较近,两者更类似于同属于一个密度空间,因而导致了该实验的不准确性。
但是,其实也可以看出,山鸢尾与其他两种鸢尾能够进行较好的区别 ,说明该方法仍适用于不同类别样本间差距较大的聚类情形。
写在最后:
本篇文章主要介绍了PCA降维、DBSCAN聚类这两个机器学习操作的基本原理,以及两者结合的用于实际数据处理的方法。
可能基于PCA降维的DBSCAN聚类的方法不是很适用于sklearn库中的鸢尾花数据集,但是该方法既具有处理高维数据的能力,也能够处理各种形状的簇,说明其作为一套较为完整的聚类方法,仍然具有较为广阔的应用场景。
希望大家能够积极应用这个方法,使得其拥有更多的应用可能性。谢谢各位!
参考书籍:
周志华.机器学习[M].北京:清华大学出版社,2016.01
参考文章:
六种常见聚类算法:http://t.csdn.cn/Urhn9
Python PCA(主成分分析法)降维的两种实现:http://t.csdn.cn/NlAeU
DBSCAN聚类算法Python实现:http://t.csdn.cn/lkFhF
PCA降维原理 操作步骤与优缺点:http://t.csdn.cn/QiEJM
好了以上就是所有的内容,希望大家多多关注,点赞,收藏,这对我有很大的帮助。谢谢大家了!
好了,这里是Kamen Black 君。祝国康家安,大家下次再见喽!!!
溜溜球~~
相关文章:

结合PCA降维的DBSCAN聚类方法(附Python代码)
目录 前言介绍: 1、PCA降维: (1)概念解释: (2)实现步骤: (3)优劣相关: 2、DBSCAN聚类: (1)概念解释&a…...

限流:计数器、漏桶、令牌桶 三大算法的原理与实战(史上最全)
限流 限流是面试中的常见的面试题(尤其是大厂面试、高P面试) 注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请到文末《技术自由圈》公号获取 为什么要限流 简单来说: 限流在很多场景中用来…...

Redis用于全局ID生成器、分布式锁的解决方案
全局ID生成器 每个店铺都可以发布优惠卷 当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增id就存在一些问题: 1.id的规律性太明显 2.受单表数据量的限制 全局ID生成器,是一种在分布式系…...

OpenTex 企业内容管理平台
OpenText 企业内容管理平台 将内容服务与领先应用程序集成,弥合内容孤岛、加快信息流并扩大治理 什么是内容服务集成? 内容服务集成通过将内容管理平台与处于流程核心的独立应用程序和系统连接起来,支持并扩展了 ECM 的传统优势。 最好的内…...

【0基础学爬虫】爬虫基础之数据存储
大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学…...

Redis与本地缓存组合使用(IT枫斗者)
Redis与本地缓存组合使用 前言 我们开发中经常用到Redis作为缓存,将高频数据放在Redis中能够提高业务性能,降低MySQL等关系型数据库压力,甚至一些系统使用Redis进行数据持久化,Redis松散的文档结构非常适合业务系统开发…...

手把手教你学习IEC104协议和编程实现 十 故障事件与复位进程
故障事件 目的 在IEC104普遍应用之前,据我了解多个协议,再综合自动化协议中,有这么一个概念叫“事故追忆”,意思是当变电站出现事故的时候,不但要记录事故的时间,还需记录事故前后模拟量的数据,从而能从一定程度上分析事故产生的原因,这个模拟量就是和今天讲解的故障…...

浅析分布式理论的CAP
大家好,我是易安! 今天让我们来聚焦于分布式系统架构中的重要理论——CAP理论。在分布式系统中,可用性和数据一致性是两个至关重要的因素,而CAP理论就是在这两者之间提供了一种权衡的原则,帮助我们在设计分布式系统时进…...
使用 TensorFlow 构建机器学习项目:6~10
原文:Building Machine Learning Projects with TensorFlow 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象&#x…...

使用 LXCFS 文件系统实现容器资源可见性
使用 LXCFS 文件系统实现容器资源可见性一、基本介绍二、LXCFS 安装与使用1.安装 LXCFS 文件系统2.基于 Docker 实现容器资源可见性3.基于 Kubernetes 实现容器资源可见性前言:Linux 利用 Cgroup 实现了对容器资源的限制,但是当在容器内运行 top 命令时就…...

SQL LIMIT
SQL LIMIT SQL LIMIT子句简介 要检索查询返回的行的一部分,请使用LIMIT和OFFSET子句。 以下说明了这些子句的语法: SELECT column_list FROMtable1 ORDER BY column_list LIMIT row_count OFFSET offset;在这个语法中, row_count确定将返…...

OpenCV实战之人脸美颜美型(六)——磨皮
1.需求分析 有个词叫做“肤若凝脂”,直译为皮肤像凝固的油脂,形容皮肤洁白且光润,这是对美女的一种通用评价。实际生活中我们的皮肤多少会有一些毛孔、斑点等表现,在观感上与上述的“光润感”相反,因此磨皮也成为美颜算法中的一项基础且重要的功能。让皮肤变得更加光润,就…...
Java技术栈—重装系统后不重新安装也能正常使用的设置方式
声明: 最近在重装电脑,重装完后,开发工具会有些功能使用不了,在这做个记录!这里是 JAVA 技术栈 问题描述: git 右键无菜单 111 git git 右键无菜单 参考文章:注册表修复git右键无菜单 git …...

智驾升级!ADB+AFS「起势」
目前,乘用车前大灯已经完成从传统卤素、氙气到LED的转型升级,高工智能汽车研究院监测数据显示,2022年中国市场(不含进出口)乘用车前装标配LED前大灯搭载率达到75.99%,同比2021年提高约7个百分点。 而相比而…...
算法记录 | Day27 回溯算法
39.组合总和 思路: 1.确定回溯函数参数:定义全局遍历存放res集合和单个path,还需要 candidates数组 targetSum(int)目标和。 startIndex(int)为下一层for循环搜索的起始位置。 2.终止条件…...

性能测试总结-根据工作经验总结还比较全面
性能测试总结性能测试理论性能测试的策略基准测试负载测试稳定性测试压力测试并发测试性能测试的指标响应时间并发数吞吐量资源指标性能测试流程性能测试工具JMeter基本使用元件构成线程组jmeter的分布式使用jmeter测试报告常用插件性能测试的计算1.根据请求数明细数据计算满足…...
类型断言[as语法 | <> 语法
TypeScript中的类型断言[as语法 | <> 语法] https://huaweicloud.csdn.net/638f0fbbdacf622b8df8e283.html?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2~default~CTRLIST~activity-1-107633405-blog-122438115.2…...
barret reduction原理详解及硬件优化
背景介绍 约减算法,通常应用在硬件领域,因为模运算mod是一个除法运算,在硬件中实现速度会比乘法慢的多,并且还会占用大量资源,因此需要想办法用乘法及其它简单运算来替代模运算。模约减算法可以利用乘法、加法和移位等…...

NLP / LLMs中的Temperature 是什么?
ChatGPT, GPT-3, GPT-3.5, GPT-4, LLaMA, Bard等大型语言模型的一个重要的超参数 大型语言模型能够根据给定的上下文或提示生成新文本,由于神经网络等深度学习技术的进步,这些模型越来越受欢迎。可用于控制生成语言模型行为的关键参数之一是Temperature …...

c#快速入门~在java基础上,知道C#和JAVA 的不同即可
☺ 观看下文前提:如果你的主语言是java,现在想再学一门新语言C#,下文是在java基础上,对比和java的不同,快速上手C#,当然不是说学C#的前提是需要java,而是下文是从主语言是java的情况下ÿ…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...