结合PCA降维的DBSCAN聚类方法(附Python代码)

 

目录

前言介绍:

1、PCA降维:

(1)概念解释:

(2)实现步骤:

(3)优劣相关: 

2、DBSCAN聚类:

(1)概念解释:

(2)算法原理:

(3)优劣相关:

代码实现:

0、数据准备:

1、PCA降维:

2、DBSCAN聚类:

3、代码汇总:

实现效果:

1、降维效果:

2、聚类效果:

写在最后:


 

前言介绍:

1、PCA降维:

(1)概念解释:

3f361d7fea82414ca1d0245aa2849b0b.pngPCA,全称Principal Component Analysis,即主成分分析。是一种降维方法,实现途径是提取特征的主要成分,从而在保留主要特征的情况下,将高维数据压缩到低维空间。

6f1bdd5bab6a430ab875e12d0707ea00.png在经过PCA处理后得到的低维数据,其实是原本的高维特征数据在某一低维平面上的投影只要维度较低,都可以视为平面,例如三维相对于四维空间也可以视为一个平面)。虽然降维的数据能够反映原本高维数据的大部分信息,但并不能反映原本高维空间的全部信息,因此要根据实际情况,加以鉴别使用

        (2)实现步骤:

        6f1bdd5bab6a430ab875e12d0707ea00.pngPCA主要通过6个步骤加以实现:

        1、标准化(将原始数据进行标准化,一般是去均值,如果特征在不同量级上,还要将矩阵除以标准差)

        具体:

43c90c21dd574a628e433ed7803e1b5c.bmp

        其中,E为原始矩阵,Emean为均值矩阵,Enorm为标准化矩阵。

 

        2、协方差(计算标准化数据集的协方差矩阵)

        具体:

ae0a75cb6c6546a19b8c0eb5db4188b0.bmp

        其中,Cov为协方差矩阵,m为样本的数量,Enorm为均值矩阵。

 

        3、特征量(计算协方差矩阵的特征值和特征向量)

        具体:

        假设实数λ、n行(原始矩阵E的列数即为n)1列的矩阵X(即n维向量)满足下式:

139b88e78691423d8894128f030be4f7.bmp

        则λ为Cov的特征值,其中Cov为协方差矩阵。

 

        4、K 特征(保留特征值最大的前K个特征(K是降维后,我们期望达到的维度))

        具体:

        若有多个特征值,则保留前K个最大的特征值,以满足之后的计算需求。

 

        5、K 向量(找到这K个特征值对应的特征向量)

        具体:

        通过步骤3中的公式得到每个特征值对应的特征向量。

 

        6、得降维(将标准化数据集乘以该K个特征向量,得到降维后的结果)

        具体:

        d845b46e452e48bfbc58e05b706b1c6b.bmp

        其中,Epca为最后要求得的PCA降维矩阵,Enorm为标准化矩阵,X1、X2、X3、...、Xk为对K个特征值对应的特征向量。

        (3)优劣相关: 

        6f1bdd5bab6a430ab875e12d0707ea00.png优点:   

        1.PCA降维之后的各个主成分之间相互正交,可消除原始数据之间相互影响的因素

        2.PCA降维的计算过程并不复杂,因此实现起来较简单容易

        3.在保留大部分主要信息的前提下,起到了降维,简便化计算效果。

        6f1bdd5bab6a430ab875e12d0707ea00.png缺点

        1.特征主成分的定义具有模糊性解释性差

        2.PCA降维选取令原数据在新坐标轴上方差最大的主成分的标准,使得一些方差小的特征较易丢失,有损失重要信息的可能性

2、DBSCAN聚类:

        (1)概念解释:

        6f1bdd5bab6a430ab875e12d0707ea00.png密度聚类亦称“基于密度的聚类”(Density-Based Clustering),此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连续性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。

        DBSCAN(Density-Based Spatial Clustering of Applications with Noise)就是这样一种聚类算法,该算法基于一组“领域”(neighborhood)参数(ε,MinPts)来刻画样本分布的紧密程度

        (2)算法原理:

       6f1bdd5bab6a430ab875e12d0707ea00.png 给定数据集D={x1,x2,...,xm},定义下面这几个概念:

d64d8f508a2848dd8343b3df86a2aa74.png

9fdb9ff77a7642359488cd9932471d10.png

ddc7417999654a0d9338d045b0b42a54.png

b71656162e584be0870332ef8de3dd75.png

9404d3989d51482e903d5d0a21ebc7eb.png

 ff93787632564d2b9b9e8885f84f5005.png

         6f1bdd5bab6a430ab875e12d0707ea00.png理解了相关概念之后,下面给出算法实现的伪代码

 211c9a80f576444b8ef611391279a6b7.png

        (3)优劣相关:

              6f1bdd5bab6a430ab875e12d0707ea00.png优点:

              1、能够识别任意形状的样本。

              2、该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇。

              3、无需指定簇个数,而是由算法自主发现。

              6f1bdd5bab6a430ab875e12d0707ea00.png缺点:

              1、需要指定最少点个数(MinPts)与半径(ε)。(但其实相对其他聚类算法来说,已经具有较大的自由性。)

              2、最少点个数与半径对算法的影响较大,一般需多次调试。

代码实现:

0、数据准备:

              6f1bdd5bab6a430ab875e12d0707ea00.png在这里,我们使用sklearn库的鸢尾花iris数据集(sklearn.datasets.load_iris)作为测试数据样本。iris数据集包含150个样本,每个样本包含四个属性特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和一个类别标签(分别用0、1、2表示山鸢尾、变色鸢尾和维吉尼亚鸢尾)。

              6f1bdd5bab6a430ab875e12d0707ea00.png首先,我们要安装sklearn库。安装此库,还是通过pip install命令,但是并不是pip install sklearn,而是pip install scikit-learn。正如我们调用opencv是import cv2,而安装却是通过pip install opencv一样。 

pip install scikit-learn

              6f1bdd5bab6a430ab875e12d0707ea00.png然后,获取数据集,其中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 np

def 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 copy

def DBSCAN_cluster(mat,eps,min_Pts): #进行DBSCAN聚类,优点在于不用指定簇数量,而且适用于多种形状类型的簇
    k = -1
    neighbor_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 + 1
        Q = 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] & gama
                deltalist = list(delta)
                for i in range(len(delta)):
                    Q.append(deltalist[i])
                    gama = gama - delta
        Ck = gama_old - gama
        Cklist = list(Ck)
        for i in range(len(Ck)):
            cluster[Cklist[i]] = k
        omega_list = omega_list - Ck
    return cluster

3、代码汇总:

from sklearn.datasets import load_iris
import numpy as np
import random
import copy
import matplotlib.pyplot as plt

def 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

def find_neighbor(data,pos,eps): #寻找相邻点函数
    N = list()
    temp = np.sum((data-data[pos])**2, axis=1)**0.5
    N = np.argwhere(temp <= eps).flatten().tolist()
    return set(N)

def DBSCAN_cluster(data,eps,min_Pts): #进行DBSCAN聚类,优点在于不用指定簇数量,而且适用于多种形状类型的簇,如果使用K均值聚类的话,对于这次实验的数据(条状簇)无法得到较好的分类结果
    k = -1
    neighbor_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 + 1
        Q = 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] & gama
                deltalist = list(delta)
                for i in range(len(delta)):
                    Q.append(deltalist[i])
                    gama = gama - delta
        Ck = gama_old - gama
        Cklist = list(Ck)
        for i in range(len(Ck)):
            cluster[Cklist[i]] = k
        omega_list = omega_list - Ck
    return cluster

if __name__ == "__main__":
    #1、准备数据
    x = load_iris().data
    y = 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、降维效果:

6f1bdd5bab6a430ab875e12d0707ea00.png降维之前的鸢尾花数据集特征集:

f323b8929b2f44028dfb4f95ce4c8090.png

6f1bdd5bab6a430ab875e12d0707ea00.png降维之后的鸢尾花数据集特征集:

0b682f9e9f654db1b7c446ea66511992.png

2、聚类效果:

40bf123e9d744fa69a17bbe6dce7f9e1.png

6f1bdd5bab6a430ab875e12d0707ea00.png可以看出来,DBSCAN聚类方法并不能很准确地根据PCA降维后的鸢尾花特征集对鸢尾花样本进行聚类,原因是变色鸢尾与维吉尼亚鸢尾的样本特征较近,两者更类似于同属于一个密度空间,因而导致了该实验的不准确性。

6f1bdd5bab6a430ab875e12d0707ea00.png但是,其实也可以看出,山鸢尾与其他两种鸢尾能够进行较好的区别 ,说明该方法仍适用于不同类别样本间差距较大的聚类情形

写在最后:

6f1bdd5bab6a430ab875e12d0707ea00.png本篇文章主要介绍了PCA降维、DBSCAN聚类这两个机器学习操作的基本原理,以及两者结合的用于实际数据处理的方法

6f1bdd5bab6a430ab875e12d0707ea00.png可能基于PCA降维的DBSCAN聚类的方法不是很适用于sklearn库中的鸢尾花数据集,但是该方法既具有处理高维数据的能力,也能够处理各种形状的簇,说明其作为一套较为完整的聚类方法,仍然具有较为广阔的应用场景

6f1bdd5bab6a430ab875e12d0707ea00.png希望大家能够积极应用这个方法,使得其拥有更多的应用可能性。谢谢各位!

6f1bdd5bab6a430ab875e12d0707ea00.png参考书籍:

周志华.机器学习[M].北京:清华大学出版社,2016.01

6f1bdd5bab6a430ab875e12d0707ea00.png参考文章:

六种常见聚类算法: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

 

 46d908c6026d42fd8094221c13854163.png好了以上就是所有的内容,希望大家多多关注,点赞,收藏,这对我有很大的帮助。谢谢大家了!

31deec53974c4aea8cc517b8385f9cf1.gif

1ea540028ba44c97a3c22e18317cf3e9.png好了,这里是Kamen Black 君。祝国康家安,大家下次再见喽!!!溜溜球~~ 

04eff7ea64b0424599b1579769341f81.jpeg

 

 

  • 6
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
### 回答1: DBSCAN聚类算法是一种基于密度的聚类算法,它可以有效地处理噪声和非凸形状的数据集。在Python中,可以使用scikit-learn库中的DBSCAN类来实现该算法。 为了改进DBSCAN聚类算法,可以考虑以下几点: 1. 调整参数:DBSCAN算法中的两个重要参数是eps和min_samples。eps表示邻域的半径大小,min_samples表示一个簇中最少需要的样本数。可以通过调整这两个参数来改进算法的聚类效果。 2. 数据预处理:在进行聚类之前,可以对数据进行预处理,例如去除异常值、归一化等操作,以提高聚类的准确性。 3. 使用其他聚类算法:除了DBSCAN算法,还有许多其他的聚类算法,例如K-Means、层次聚类等。可以尝试使用其他算法来进行比较,以找到最适合数据集的聚类算法。 4. 结合其他技术:可以将DBSCAN算法与其他技术结合使用,例如PCA降维、特征选择等,以提高聚类效果。 总之,改进DBSCAN聚类算法需要综合考虑数据集的特点、算法参数、数据预处理等多个方面,以达到最优的聚类效果。 ### 回答2: DBSCAN聚类算法是一种基于密度的聚类算法,其优点在于可以自动识别任意形状的簇,并且能够对噪声数据进行有效过滤,因此在实际应用中得到了广泛的应用。不过,该算法的性能表现并不是很好,尤其是在处理大规模数据时,需要耗费大量的时间和内存。因此,针对DBSCAN算法的性能问题,我们可以进行以下改进: 1. 改进数据结构:通常情况下,我们使用的是基于数组的数据结构来实现DBSCAN算法,但是,这种数据结构并不适合处理大规模数据,并且需要耗费大量的时间和内存。因此,我们可以改用基于树形结构的数据结构,如k-d tree,来存储数据,这样可以大大提高算法的性能表现。 2. 基于分布式计算:在面对大规模数据聚类时,可以将数据分配到多个节点上进行并行计算,这样可以加速聚类过程。同时,分布式计算还可以提高算法的可扩展性,并且可以有效降低内存消耗。 3. 引入采样方法:在处理大规模数据时,可以采用一些采样方法,如随机采样、均匀采样等等,来减少数据量,从而降低算法的计算复杂度。通过采用合适的采样策略,可以在保证聚类结果精度的同时,提高算法的性能表现。 4. 调整参数:DBSCAN算法中有两个重要参数,即Eps和MinPts,这两个参数直接影响聚类结果和算法性能。因此,在实际使用中需要根据数据集的特性和应用需求,合理设置这两个参数。 以上四种方法是针对DBSCAN算法的常用改进方法,可以有效提高算法的性能表现,从而更好地应用于实际应用中。同时,我们可以将这些改进方法python编程语言结合起来,通过使用python编写高效、可扩展的DBSCAN聚类算法,为不同领域的研究者和实践者提供更好的数据挖掘和分析工具。 ### 回答3: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种聚类算法,可以对不同形状和密度的数据进行聚类,也能够识别出离群点。在聚类算法中,DBSCAN非常实用,能够有效地将空间上紧密相连的点聚集为一类。 Python是一种方便易用的编程语言,有很多常用的聚类包可以用于DBSCAN聚类算法,如scikit-learn、hdbscan等。在这些包中,DBSCAN的使用非常简单,仅需要一些基本的输入参数即可,如eps(邻域半径)和min_samples(核心点所需的最小样本数)。 然而,DBSCAN聚类算法也有一些注意事项。首先,需要选择适当的参数才能获得较好的聚类效果。例如,eps参数对于DBSCAN的聚类输出结果至关重要,因为它控制着聚类的紧密度和数量。其次,DBSCAN对于数据的分布类型有一定的限制,例如,它很难区分球形分布和环状分布的数据。最后,DBSCAN算法的时间复杂度较高,处理大数据集时会出现计算效率低下的问题。 为了解决这些问题,我们可以对DBSCAN聚类算法进行改进。在改进DBSCAN算法时,我们可以考虑以下几点: 1.使用高斯混合模型(Gaussian Mixture Model)结合DBSCAN。高斯混合模型可以对数据的分布类型做出更加精细的判断,从而更好地对数据进行聚类。 2.使用K-D Tree等树形结构对数据进行优化处理。这可以减少计算时间,并提高算法的效率。 3.对核心点的半径进行自适应调整。可以根据数据分布的情况,自动调整核心点的半径,从而更好地适应不同的数据形态。 总之,针对DBSCAN聚类算法,我们可以通过各种手段进行优化和改进,从而更好地适应数据分析的需求。不论是在Python中使用DBSCAN还是对其进行改进,了解DBSCAN算法的优劣点和特点是非常重要的。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kamen Black君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值