当前位置: 首页 > news >正文

结合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代码)

目录 前言介绍&#xff1a; 1、PCA降维&#xff1a; &#xff08;1&#xff09;概念解释&#xff1a; &#xff08;2&#xff09;实现步骤&#xff1a; &#xff08;3&#xff09;优劣相关&#xff1a; 2、DBSCAN聚类&#xff1a; &#xff08;1&#xff09;概念解释&a…...

限流:计数器、漏桶、令牌桶 三大算法的原理与实战(史上最全)

限流 限流是面试中的常见的面试题&#xff08;尤其是大厂面试、高P面试&#xff09; 注&#xff1a;本文以 PDF 持续更新&#xff0c;最新尼恩 架构笔记、面试题 的PDF文件&#xff0c;请到文末《技术自由圈》公号获取 为什么要限流 简单来说&#xff1a; 限流在很多场景中用来…...

Redis用于全局ID生成器、分布式锁的解决方案

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

OpenTex 企业内容管理平台

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

【0基础学爬虫】爬虫基础之数据存储

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

Redis与本地缓存组合使用(IT枫斗者)

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

手把手教你学习IEC104协议和编程实现 十 故障事件与复位进程

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

浅析分布式理论的CAP

大家好&#xff0c;我是易安&#xff01; 今天让我们来聚焦于分布式系统架构中的重要理论——CAP理论。在分布式系统中&#xff0c;可用性和数据一致性是两个至关重要的因素&#xff0c;而CAP理论就是在这两者之间提供了一种权衡的原则&#xff0c;帮助我们在设计分布式系统时进…...

使用 TensorFlow 构建机器学习项目:6~10

原文&#xff1a;Building Machine Learning Projects with TensorFlow 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#x…...

使用 LXCFS 文件系统实现容器资源可见性

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

SQL LIMIT

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

OpenCV实战之人脸美颜美型(六)——磨皮

1.需求分析 有个词叫做“肤若凝脂”,直译为皮肤像凝固的油脂,形容皮肤洁白且光润,这是对美女的一种通用评价。实际生活中我们的皮肤多少会有一些毛孔、斑点等表现,在观感上与上述的“光润感”相反,因此磨皮也成为美颜算法中的一项基础且重要的功能。让皮肤变得更加光润,就…...

Java技术栈—重装系统后不重新安装也能正常使用的设置方式

声明&#xff1a; 最近在重装电脑&#xff0c;重装完后&#xff0c;开发工具会有些功能使用不了&#xff0c;在这做个记录&#xff01;这里是 JAVA 技术栈 问题描述&#xff1a; git 右键无菜单 111 git git 右键无菜单 参考文章&#xff1a;注册表修复git右键无菜单 git …...

智驾升级!ADB+AFS「起势」

目前&#xff0c;乘用车前大灯已经完成从传统卤素、氙气到LED的转型升级&#xff0c;高工智能汽车研究院监测数据显示&#xff0c;2022年中国市场&#xff08;不含进出口&#xff09;乘用车前装标配LED前大灯搭载率达到75.99%&#xff0c;同比2021年提高约7个百分点。 而相比而…...

算法记录 | Day27 回溯算法

39.组合总和 思路&#xff1a; 1.确定回溯函数参数&#xff1a;定义全局遍历存放res集合和单个path&#xff0c;还需要 candidates数组 targetSum&#xff08;int&#xff09;目标和。 startIndex&#xff08;int&#xff09;为下一层for循环搜索的起始位置。 2.终止条件…...

性能测试总结-根据工作经验总结还比较全面

性能测试总结性能测试理论性能测试的策略基准测试负载测试稳定性测试压力测试并发测试性能测试的指标响应时间并发数吞吐量资源指标性能测试流程性能测试工具JMeter基本使用元件构成线程组jmeter的分布式使用jmeter测试报告常用插件性能测试的计算1.根据请求数明细数据计算满足…...

类型断言[as语法 | <> 语法

TypeScript中的类型断言[as语法 | &#xff1c;&#xff1e; 语法] 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原理详解及硬件优化

背景介绍 约减算法&#xff0c;通常应用在硬件领域&#xff0c;因为模运算mod是一个除法运算&#xff0c;在硬件中实现速度会比乘法慢的多&#xff0c;并且还会占用大量资源&#xff0c;因此需要想办法用乘法及其它简单运算来替代模运算。模约减算法可以利用乘法、加法和移位等…...

NLP / LLMs中的Temperature 是什么?

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

c#快速入门~在java基础上,知道C#和JAVA 的不同即可

☺ 观看下文前提&#xff1a;如果你的主语言是java&#xff0c;现在想再学一门新语言C#&#xff0c;下文是在java基础上&#xff0c;对比和java的不同&#xff0c;快速上手C#&#xff0c;当然不是说学C#的前提是需要java&#xff0c;而是下文是从主语言是java的情况下&#xff…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...