赞
踩
DBSCAN是基于密度空间的聚类算法,与KMeans算法不同,它不需要确定聚类的数量,而是基于数据推测聚类的数目,它能够针对任意形状产生聚类。
epsoiln-neighborhood(简称e-nbhd)可理解为密度空间,表示半径为e且含有若干个点的nbhd,密度等于包含点的个数/空间大小。图中中心点是(3,2),半径epsilon是0.5
根据式子密度=点的个数/面积,可以计算得到上图中密度=31/2pi(0.5)*(0.5)=62/pi,这个数字本身意义不大,但通过计算某一小区域的密度,横向对比可以得知整个区域的密度分布,由此相近的点可聚类到同一区域内。
DBSCAN算法需要首先确定两个参数:
(1)epsilon:在一个点周围邻近区域的半径
(2)minPts:邻近区域内至少包含点的个数
根据以上两个参数,结合epsilon-neighborhood的特征,可以把样本中的点分成三类:
注:边缘点density-reachable是指存在当前类中其他点作为核点所在的类中。例如,朋友的朋友(可以是n多个)也是朋友。如下图,黄圈右下角的点即为density-reachable,directly-reachable的点即为NBHD中的点。
结合2中内容,DBSCAN的一般步骤是:(在已知epsilon和minPts的前提下)
思路:读取数据,选择Grocery和Milk两列作为训练样本,对数据归一化(特征标准化),使用dbscan聚类,并作图。
特征标准化是归一化中常用的手段,特点是零均值和单位方差,对于正态分布的数据拟合很好。
# coding=utf-8 import numpy as np from scipy.spatial.distance import cdist import matplotlib.pyplot as plt import seaborn as sns sns.set() from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler import pandas as pd data = pd.read_csv("data/wholesale.csv") data.drop(["Channel", "Region"], axis=1, inplace=True) data = data[["Grocery", "Milk"]] data = data.as_matrix().astype("float32", copy=False)#convert to array #数据预处理,特征标准化,每一维是零均值和单位方差 stscaler = StandardScaler().fit(data) data = stscaler.transform(data) #画出x和y的散点图 plt.scatter(data[:, 0], data[:, 1]) plt.xlabel("Groceries") plt.ylabel("Milk") plt.title("Wholesale Data - Groceries and Milk") plt.savefig("results/wholesale.png", format="PNG") dbsc = DBSCAN(eps=0.5, min_samples=15).fit(data) labels = dbsc.labels_ #聚类得到每个点的聚类标签 -1表示噪点 #print(labels) core_samples = np.zeros_like(labels, dtype=bool) #构造和labels一致的零矩阵,值是false core_samples[dbsc.core_sample_indices_] = True #print(core_samples) unique_labels = np.unique(labels) colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels))) #linespace返回在【0,1】之间均匀分布数字是len个,Sepectral生成len个颜色 #print(zip(unique_labels,colors)) for (label, color) in zip(unique_labels, colors): class_member_mask = (labels == label) print(class_member_mask&core_samples) xy = data[class_member_mask & core_samples] plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=color, markersize=10) xy2 = data[class_member_mask & ~core_samples] plt.plot(xy2[:, 0], xy2[:, 1], 'o', markerfacecolor=color, markersize=5) plt.title("DBSCAN on Wholsesale data") plt.xlabel("Grocery (scaled)") plt.ylabel("Milk (scaled)") plt.savefig("results/(0.9,15)dbscan_wholesale.png", format="PNG")
(1)epsilon不变的情况下,调整minPts的大小,则minPts越大,NBHD越密集,产生离群点越多。以下四幅图对应epsilon和minPts分别是(0.5,15),(0.5,20),(0.5,40),(0.5,60)
(2)在minPts不变的情况下,epsilon越小,聚类越密集,产生离群点越多。以下三幅图分别是(0.5,15),(0.8,15),(0.9,15)
epsilon越小,minPts越多,则密度越高,产生聚类越密集。
DBSCAN最大的特点是事先不必确定聚类的种类,通过基于密度的方法,聚类并找出离群点。不仅需要对大部分在类中的点分析,也需要对离群点分析(例如统计分析被木马程序入侵的电脑,本例中牛奶需求水平较高的顾客…)
https://blog.dominodatalab.com/topology-and-density-based-clustering/?tdsourcetag=s_pcqq_aiomsg
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。