Python机器学习——DBSCAN聚类
来源:互联网 发布:粤语网络词 编辑:程序博客网 时间:2024/06/05 08:20
密度聚类(Density-based Clustering)假设聚类结构能够通过样本分布的紧密程度来确定。DBSCAN是常用的密度聚类算法,它通过一组邻域参数(
ϵ -邻域:Nϵ(x⃗ i) ={x⃗ j∈D|distance(x⃗ i,x⃗ j) ≤ϵ },Nϵ(x⃗ i) 包含了样本集D 中与x⃗ i 距离不大于ϵ 的所有样本。核心对象core object:若|
Nϵ(x⃗ i) |≥MinPts ,则称x⃗ i 是一个核心对象。即:若x⃗ i 的ϵ -邻域中至少包含MinPts 个样本,则称x⃗ i 是一个核心对象。密度直达directly density-reachable:若
x⃗ i 是一个核心对象,且x⃗ j∈ Nϵ(x⃗ i) ,则称x⃗ j 由x⃗ i 密度直达,记作x⃗ i –>x⃗ j 。密度可达density-reachable:对于
x⃗ i 和x⃗ j ,若存在样本序列(p⃗ 0,p⃗ 1,p⃗ 2,...,p⃗ m,p⃗ m+1 ),其中p⃗ 0 =x⃗ i ,p⃗ m+1 =x⃗ j ,p⃗ s∈D,s=1,2,...,m 。如果p⃗ s+1 由p⃗ s,s=1,2,...,m 密度直达,则称x⃗ j 由x⃗ i 密度可达,记作x⃗ i ~>x⃗ j 。- 密度相连density-connected:对于
x⃗ i 和x⃗ j ,若存在x⃗ k ,使得x⃗ i 和x⃗ j 均由x⃗ k 密度可达,则称x⃗ j 由x⃗ i 密度相连,记作x⃗ i ~x⃗ j 。
DBSCAN算法的定义:给定邻域参数(
- 接性connectivity:若
x⃗ i∈C,x⃗ j∈C ,则x⃗ i ~x⃗ j - 大性maximality:若
x⃗ i∈C ,且→xi ~>x⃗ j ,则x⃗ j∈C
即一个簇是由密度可达关系导出的最大的密度相连样本集合。
DBSCAN算法的思想:若
下面给出DBSCAN算法:
输入
- 数据集
D ={x⃗ 1,x⃗ 2,x⃗ 3,...,x⃗ N } - 邻域参数(
ϵ ,MinPts )
- 数据集
输出:簇划分
C ={C1,C2,...,Ck }- 算法步骤如下:
- 初始化核心对象集合为空集:Ω=
∅ - 寻找核心对象:遍历所有的样本点
x⃗ i,i=1,2,...,N ,计算Nϵ(x⃗ i) ,如果|Nϵ(x⃗ i) |≥MinPts ,则Ω=Ω⋃ {x⃗ i } - 迭代:以任一未访问过的核心对象为出发点,找出有其密度可达的样本生成的聚类簇,直到所有的核心对象都被访问为止
- 初始化核心对象集合为空集:Ω=
class sklearn.cluster.DBSCAN(eps=0.5,min_samples=5,metric='euclidean',algorithm='auto',leaf_size=30,p=None,random_state=None)
参数
eps :ϵ 参数,用于确定邻域大小。min_samples :MinPts 参数,用于判断核心对象。metric :一个字符串或可调用对象,用于计算距离。如果是字符串,则必须是在metrics.pairwise.calculate_distance中指定。algorithm :一个字符串,用于计算两点间距离并找出最近邻的点,可以为如下:- ‘
auto ’:由算法自动取舍合适的算法。 - ‘
ball_tree ’:用ball树来搜索。 - ‘
kd_tree ’:用kd树搜索。 - ‘
brute ’:暴力搜索。
- ‘
leaf_size :一个整数,用于指定当algorithm=ball_tree或kd_tree时,树的叶节点大小。该参数会影响构建树,搜索最近邻的速度,同时影响树的内存。random_state :被废弃的接口,将在scikit-learn v 0.18中移除。
属性
core_sample_indices_ :核心样本在原始训练集中的位置。components_ :核心样本的一份副本。labels_ :每个样本所属的簇标记。对于噪声样本,其簇标记为-1副本。
方法
fit(X[,y,sample_weight]) :训练模型。fit_predict(X[,y,sample_weight]) :训练模型并预测每个样本所属的簇标记。
#导包from sklearn import clusterfrom sklearn.metrics import adjusted_rand_scoreimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets.samples_generator import make_blobsfrom sklearn import mixturefrom sklearn.svm.libsvm import predict
#产生数据def create_data(centers,num=100,std=0.7): X,labels_true = make_blobs(n_samples=num,centers=centers, cluster_std=std) return X,labels_true
""" 数据作图"""def plot_data(*data): X,labels_true=data labels=np.unique(labels_true) fig=plt.figure() ax=fig.add_subplot(1,1,1) colors='rgbycm' for i,label in enumerate(labels): position=labels_true==label ax.scatter(X[position,0],X[position,1],label="cluster %d"%label), color=colors[i%len(colors)] ax.legend(loc="best",framealpha=0.5) ax.set_xlabel("X[0]") ax.set_ylabel("Y[1]") ax.set_title("data") plt.show()
#测试函数def test_DBSCAN(*data): X,labels_true = data clst = cluster.DBSCAN(); predict_labels = clst.fit_predict(X) print("ARI:%s"%adjusted_rand_score(labels_true,predict_labels)) print("Core sample num:%d"%len(clst.core_sample_indices_))
#结果ARI:0.330307120902Core sample num:991
其中
下面考察
def test_DBSCAN_epsilon(*data): X,labels_true = data epsilons = np.logspace(-1,1.5) ARIs=[] Core_nums = [] for epsilon in epsilons: clst = cluster.DBSCAN(eps=epsilon) predicted_labels = clst.fit_predict(X) ARIs.append(adjusted_rand_score(labels_true,predicted_labels)) Core_nums.append(len(clst.core_sample_indices_)) fig = plt.figure(figsize=(10,5)) ax = fig.add_subplot(1,2,1) ax.plot(epsilons,ARIs,marker = '+') ax.set_xscale('log') ax.set_xlabel(r"$\epsilon$") ax.set_ylim(0,1) ax.set_ylabel('ARI') ax = fig.add_subplot(1,2,2) ax.plot(epsilons,Core_nums,marker='o') ax.set_xscale('log') ax.set_xlabel(r"$\epsilon$") ax.set_ylabel('Core_num') fig.suptitle("DBSCAN") plt.show()
centers = [[1,1],[1,2],[2,2],[10,20]]X,labels_true = create_data(centers,1000,0.5)test_DBSCAN_epsilon(X,labels_true)
可以看到
样本核心数量随着
下面接着考察
def test_DBSCAN_min_samples(*data): X,labels_true=data min_samples=range(1,100) ARIs=[] Core_nums=[] for num in min_samples: clst=cluster.DBSCAN(min_samples=num) predicted_labels=clst.fit_predict(X) ARIs.append(adjusted_rand_score(labels_true, predicted_labels)) Core_nums.append(len(clst.core_sample_indices_)) fig=plt.figure(figsize=(10,5)) ax=fig.add_subplot(1,2,1) ax.plot(min_samples,ARIs,marker='+') ax.set_xlabel("min_samples") ax.set_ylim(0,1) ax.set_ylabel('ARI') ax=fig.add_subplot(1,2,2) ax.plot(min_samples,Core_nums,marker='o') ax.set_xlabel("min_samples") ax.set_ylabel('Core_nums') fig.suptitle("DBSCAN") plt.show()
centers = [[1,1],[1,2],[2,2],[10,20]]X,labels_true = create_data(centers,1000,0.5)test_DBSCAN_min_samples(X,labels_true)
可以看出
有关
聚类的有效性指标
- Python机器学习——DBSCAN聚类
- Python机器学习应用 | 聚类——DBSCAN方法及应用
- 机器学习-python实现DBSCAN
- 机器学习算法-DBSCAN聚类
- 机器学习实战——python实现DBSCAN密度聚类
- 简单易学的机器学习算法——基于密度的聚类算法DBSCAN
- 简单易学的机器学习算法——基于密度的聚类算法DBSCAN
- 机器学习算法(聚类算法)—基于密度的聚类算法DBSCAN
- 机器学习 ELKI 使用心得 DBSCAN
- 空间统计学习笔记——DBSCAN 聚类分析
- 机器学习23-密度聚类DBSCAN算法
- 机器学习第十三课(DBSCAN,密度最大值聚类,谱聚类)
- 机器学习——Mac下机器学习python配置
- 用scikit-learn学习DBSCAN聚类
- 用scikit-learn学习DBSCAN聚类
- DBSCAN 聚类
- DBSCAN聚类
- DBSCAN 聚类
- 列表、元组及通用序列操作
- 常用数据结构之一队列
- 【C# in depth 第三版】温故而知新(1)
- 聚簇索引和非聚簇索引详解
- Hadoop1安装
- Python机器学习——DBSCAN聚类
- PHP基于数组实现的分页函数实例,可作为方法使用
- VC中MessageBox与AfxMessageBox用法与区别
- 聚簇索引与非聚簇索引的区别
- mysql基准测试-02
- 高性能Mysql主从架构的复制原理及配置详解
- haproxy+keepalived实现高可用负载均衡
- VC小技巧汇总之对话框技巧
- Linux下挂载新分区