密度聚类

·统计样本周边的密度,把密度给定一个阈值,不断的把样本添加到最近的簇。例如:人口密度,根据密度,聚类出城市

·解决类似圆形的K-Means聚类的特点;密度聚类缺点:计算复杂度大,空间索引来降低计算时间,降低查找速度。

(DBSCAN算法):

参数:DBSCAN(eps=0.5, min_samples=5, metric=‘euclidean‘, algorithm=‘auto‘, leaf_size=30, p=None, n_jobs=1)

eps:两个样本之间的最大距离,即扫描半径
min_samples :作为核心点的话邻域(即以其为圆心,eps为半径的圆,含圆上的点)中的最小样本数(包括点本身)。
-------------------
metric :度量方式,默认为欧式距离,还有metric=‘precomputed’(稀疏半径邻域图),也可以自己进行定义
algorithm:近邻算法求解方式,有四种:‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’
leaf_size:叶的大小,在使用BallTree or cKDTree近邻算法时候会需要这个参数
n_jobs :使用CPU格式,-1代表全开
-------------------
core_sample_indices_:核心样本指数。
labels_:数据集中每个点的集合标签给,噪声点标签为-1。
components_ :核心样本的副本
运行:
model = sklearn.cluster.DBSCAN(eps_领域大小圆半径,min_samples_领域内,点的个数的阈值)
model.fit(data) 训练模型
model.fit_predict(data) 模型的预测方法
代码如下:

import numpy as npimport matplotlib.pyplot as pltimport sklearn.datasets as dsimport matplotlib.colorsfrom sklearn.cluster import DBSCANfrom sklearn.preprocessing import StandardScaler

def expand(a, b):    d = (b - a) * 0.1    return a-d, b+d

if __name__ == "__main__":    N = 1000    centers = [[1, 2], [-1, -1], [1, -1], [-1, 1]]    data, y = ds.make_blobs(N, n_features=2, centers=centers, cluster_std=[0.5, 0.25, 0.7, 0.5], random_state=0)#生成4类共1000个点    data = StandardScaler().fit_transform(data)#归一化,先均值归一,再方差归一化    # 数据的超参数:(epsilon, min_sample) 即(R,NUM)每一类的半径与样本阈值num:核心点的高密度区域的最少点个数    params = ((0.2, 5), (0.2, 10), (0.2, 15), (0.3, 5), (0.3, 10), (0.3, 15))#超参数

matplotlib.rcParams[‘font.sans-serif‘] = [u‘SimHei‘]    matplotlib.rcParams[‘axes.unicode_minus‘] = False

plt.figure(figsize=(12, 8), facecolor=‘w‘)    plt.suptitle(u‘DBSCAN聚类‘, fontsize=20)    #遍历6组超参数,对聚类结果进行比较    for i in range(6):#i遍历上面设的6组超参数        eps, min_samples = params[i]#超参数赋值        model = DBSCAN(eps=eps, min_samples=min_samples)#建立模型        model.fit(data)#生成结果        y_hat = model.labels_#取出y^,所有点的分类结果。无论核心点还是边界点,只要是同一个簇的都被赋予同样的label,噪声点为-1.

core_indices = np.zeros_like(y_hat, dtype=bool)        core_indices[model.core_sample_indices_] = True#model.core_sample_indices_:核心点的索引,因为labels_不能区分核心点还是边界点,所以需要用这个索引确定核心点。

y_unique = np.unique(y_hat)#对于一维数组或者列表,unique函数去除其中重复的元素,并按元素由大到小返回一个新的无元素重复的元组或者列表        n_clusters = y_unique.size - (1 if -1 in y_hat else 0)#聚类数目        print(y_unique, ‘聚类簇的个数为:‘, n_clusters)

plt.subplot(2, 3, i+1)        clrs = plt.cm.Spectral(np.linspace(0, 0.8, y_unique.size))#Spectral:实现的功能是给label为1的点一种颜色,给label为0的点另一种颜色 np.linspace:在指定的间隔内返回均匀间隔的数字        print(clrs)        for k, clr in zip(y_unique, clrs):#zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象            cur = (y_hat == k)            if k == -1:                plt.scatter(data[cur, 0], data[cur, 1], s=20, c=‘k‘)                continue            plt.scatter(data[cur, 0], data[cur, 1], s=30, c=clr, edgecolors=‘k‘)            plt.scatter(data[cur & core_indices][:, 0], data[cur & core_indices][:, 1], s=60, c=clr, marker=‘o‘, edgecolors=‘k‘)        x1_min, x2_min = np.min(data, axis=0)        x1_max, x2_max = np.max(data, axis=0)        x1_min, x1_max = expand(x1_min, x1_max)        x2_min, x2_max = expand(x2_min, x2_max)        plt.xlim((x1_min, x1_max))        plt.ylim((x2_min, x2_max))        plt.grid(True)        plt.title(u‘epsilon = %.1f  m = %d,聚类数目:%d‘ % (eps, min_samples, n_clusters), fontsize=16)    plt.tight_layout()    plt.subplots_adjust(top=0.9)    plt.show()    plt.savefig(‘密度分类结果.png‘)

原文地址:https://www.cnblogs.com/xiguapipipipi/p/10109789.html

时间: 2024-10-13 02:35:21

密度聚类的相关文章

基于密度聚类的DBSCAN算法

根据各行业特性,人们提出了多种聚类算法,简单分为:基于层次.划分.密度.图论.网格和模型的几大类. 其中,基于密度的聚类算法以DBSCAN最具有代表性. 假设有如下图的一组数据, 生成数据的R代码如下 x1 <- seq(0,pi,length.out=100) y1 <- sin(x1) + 0.1*rnorm(100) x2 <- 1.5+ seq(0,pi,length.out=100) y2 <- cos(x2) + 0.1*rnorm(100) data <- da

DBSCAN密度聚类算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集.下面我们就对DBSCAN算法的原理做一个总结. 1. 密度聚类原理 DBSCAN是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定.同一类别的样本,他们

ML: 聚类算法R包 - 密度聚类

密度聚类 fpc::dbscan fpc::dbscan DBSCAN核心思想:如果一个点,在距它Eps的范围内有不少于MinPts个点,则该点就是核心点.核心和它Eps范围内的邻居形成一个簇.在一个簇内如果出现多个点都是核心点,则以这些核心点为中心的簇要合并.其中要注意参数eps的设置,如果eps设置过大,则所有的点都会归为一个簇,如果设置过小,那么簇的数目会过多.如果MinPts设置过大的话,很多点将被视为噪声点(先计算距离矩阵,然后看一下距离大概都是多少,找个靠谱的设置成半径) 优点: 对

一种简化的密度聚类方法

先说一下什么是密度聚类的方法 参考文章:基于密度的聚类 这篇文章的大概意思通过一幅图来说明: 1 首先任意选定一个点假设就以图中最左边的h为第一个点,根据半径判断,在一定的范围内点的个数是否满足要求. -如果满足把这个点标记为核心点,这个圆判定为一个聚类. -如果不是,就把这个点判定为边界点,标记为噪声:在随机选取一个点. 2 确定这一类,依次判断这个圆内的点的属性(核心,边界). 3 如果还有没有被标记的点,在任意选取一个点从上面开始做,一直到标记完所有的点. 优点: 1 对噪声不敏感. 2

数据挖掘导论:2、密度聚类

密度聚类知识介绍:参见了这篇文章http://blog.csdn.net/uestcfrog/article/details/6876360 定义: 1.      对于空间中的一个对象,如果它在给定半径e的邻域中的对象个数大于密度阀值MinPts,则该对象被称为核心对象,否则称为边界对象. 2.      如果p是一个核心对象,q属于p的邻域,那么称p直接密度可达q. 3.      如果存在一条链<p1,p2,-..,pi>,满足p1=p,pi=q,pi直接密度可达pi+1,则称p密度可达

DBSCAN密度聚类

1. 密度聚类概念 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集. 2. 密度聚类步骤 DBSCAN算法描述: 输入: 包含n个对象的数据库,半径e,最少数目MinPts; 输出:所有生成的簇,达到密度要求. (1)Repeat (

【机器学习】---密度聚类从初识到应用

一.前述 密度聚类是一种能降噪的算法. 二.相关概念 先看些抽象的概念(官方定义): 1.:对象O的是与O为中心,为半径的空间,参数,是用户指定每个对象的领域半径值. 2.MinPts(领域密度阀值):对象的的对象数量. 3.核心对象:如果对象O的对象数量至少包含MinPts个对象,则该对象是核心对象. 4.直接密度可达:如果对象p在核心对象q的内,则p是从q直接密度可达的. 5.密度可达:在DBSCAN中,p是从q(核心对象)密度可达的,如果存在对象链,使得,是从关于和MinPts直接密度可达

聚类算法--K-means和k-mediods/密度聚类/层次聚类

目录 简述 K-means聚类 密度聚类 层次聚类 一.简述 聚类算法是常见的无监督学习(无监督学习是在样本的标签未知的情况下,根据样本的内在规律对样本进行分类). 在监督学习中我们常根据模型的误差来衡量模型的好坏,通过优化损失函数来改善模型.而在聚类算法中是怎么来度量模型的好坏呢?聚类算法模型的性能度量大致有两类: 1)将模型结果与某个参考模型(或者称为外部指标)进行对比,个人觉得认为这种方法用的比较少 2)另一种是直接使用模型的内部属性,比如样本之间的距离(闵可夫斯基距离)来作为评判指标,这

【ML-7】聚类算法--K-means和k-mediods/密度聚类/层次聚类

目录 简述 K-means聚类 密度聚类 层次聚类 一.简述 聚类算法是常见的无监督学习(无监督学习是在样本的标签未知的情况下,根据样本的内在规律对样本进行分类). 在监督学习中我们常根据模型的误差来衡量模型的好坏,通过优化损失函数来改善模型.而在聚类算法中是怎么来度量模型的好坏呢?聚类算法模型的性能度量大致有两类: 1)将模型结果与某个参考模型(或者称为外部指标)进行对比,个人觉得认为这种方法用的比较少 2)另一种是直接使用模型的内部属性,比如样本之间的距离(闵可夫斯基距离)来作为评判指标,这