matlab编程实现基于密度的聚类(DBSCAN)
1. DBSCAN聚类的基本原理
详细原理可以参考链接:
https://www.cnblogs.com/pinard/p/6208966.html
这是找到的相对很详细的介绍了,此链接基本仍是周志华《机器学习》中的内容,不过这个链接更通俗一点,且算法流程感觉比《机器学习》书中的伪代码形式算法流程更清晰。
2. matlab实现DBSCAN聚类
参考《机器学习》中的伪代码编写的算法,具体代码如下:
function [clusterIndex, dataType] = DBSCAN(data, r, minPts)
% 本函数用于基于密度的聚类(DBSCAN)
% 输入data为聚类数据,每行一个数据点
% 输入r为密度聚类的滑动窗口半径参数
% 输入minPts为滑动窗口内数据量阈值参数
% 输出clusterIndex为数据对应的类别号组成的序列
% 输出objType为数据样本类型,0表示噪声样本,1表示边缘对象,2表示核心对象% 数据量大小
dataSize = length(data(:, 1));
% 预分配输出的内存
clusterIndex = zeros(dataSize, 1);
dataType = zeros(dataSize, 1);
% 获得距离方阵
distanceMatrix = squareform(pdist(data));% 标记核心对象集合
% 这里直接用距离矩阵判断,相当于把自己到自己的距离0也算进去
for i = 1 : dataSizeif sum(distanceMatrix(:, i) < r) >= minPtsdataType(i) = 2;end
end
% 保存核心对象
coreObj = data(dataType == 2, :);% 初始化聚类簇的标记
k = 0;
% 初始化未被访问的样本集合
noData = data;% 进入迭代,如果核心对象集合非空,则进入迭代过程
while ~isempty(coreObj)% 记录当前未被访问样本集合,noData数据每次迭代会更新noDataOld = noData;% 随机选择一个核心对象作为初始迭代对象randCoreIndex = randperm(length(coreObj(:, 1)), 1);initCoreObj = coreObj(randCoreIndex, :);% 初始化队列,最初Q只有一个初始核心对象Q = initCoreObj;% 注:集合运算后默认是将集合排序过的,需要加stable参数来保持原来的顺序% 从未访问样本中删去随机选择的这个核心对象,只删除这一个,不删除它密度直达的对象noData = setdiff(noData, initCoreObj, 'stable', 'rows');% 进入循环,找到Q的所有密度可达对象,并放入队列Q中while ~isempty(Q)% 取出Q中的第一个元素q = Q(1, :);Q(1, :) = [];% 再次距离计算,找到点q邻域内的数据个数qSizeqIndex = ismember(data, q, 'rows') == 1;qSize = sum(distanceMatrix(qIndex, :) <= r);% q邻域内的数据qAeraData = data(distanceMatrix(qIndex, :) <= r, :);% 如果数量超过阈值,则将邻域内的的未访问的数据赋给队列Q if qSize >= minPts% 求交集D = qAereData∩noDataD = intersect(qAeraData, noData, 'stable', 'rows');% 将D中的元素加入队列QQ = union(Q, D, 'stable', 'rows');% 再将这些数据从未访问数据noData中删除掉noData = setdiff(noData, D, 'stable', 'rows'); endendk = k + 1;% 生成聚类簇kCluster = setdiff(noDataOld, noData, 'stable', 'rows');coreObj = setdiff(coreObj, kCluster, 'stable', 'rows');% 记录类编号clusterIndex(ismember(data, kCluster, 'rows')) = k;
end% 遍历得到边缘对象(非核心对象,但在类中)
for i = 1 : dataSizeif (dataType(i) ~= 2) && (clusterIndex(i) ~= 0)dataType(i) = 1;end
end% 函数结束
end
主函数调用:
clear all; close all;
model_class = 3;
dim = 2;
% 期望值
m = [0, 0;2, 2;-2, -2];
% 协方差阵
s(:, :, 1) = [0.1, 0;0, 0.1];
s(:, :, 2) = [0.5, 0.3;0.3, 0.5];
s(:, :, 3) = [1, -0.5;-0.5, 1];num = [500, 500, 500];
data = generate_data_GMM(dim, model_class, m, s, num);
data = data(:, (1:2));[T, N] = DBSCAN(data, 0.27, 9);figure(1)
for i = 1 : length(T)if N(i) == 0plot(data(i, 1), data(i, 2), '*k');hold on;% 边缘对象elseif N(i) == 1if T(i) == 1plot(data(i, 1), data(i, 2), 'or');hold on;elseif T(i) == 2plot(data(i, 1), data(i, 2), 'og');hold on;elseif T(i) == 3plot(data(i, 1), data(i, 2), 'ob');hold on;else plot(data(i, 1), data(i, 2), 'oy');hold on;endelse % 核心对象if T(i) == 1plot(data(i, 1), data(i, 2), '.r');hold on;elseif T(i) == 2plot(data(i, 1), data(i, 2), '.g');hold on;elseif T(i) == 3plot(data(i, 1), data(i, 2), '.b');hold on;else plot(data(i, 1), data(i, 2), '.y');hold on;endendgrid on;
end% watermelon4_0 = load('watermelon4.0.txt');
% data = watermelon4_0;
聚类结果如下:
注:主函数给了两个例子,一个是基于高斯分布数据,一个是基于《机器学习》书籍上的西瓜数据集4.0。这里高斯分布数据用到了笔者自编写的generate_data_GMM函数,这个函数详细说明及代码请查看:
https://blog.csdn.net/sangnanpo/article/details/104222339
3. 其他说明
DBSCAN的主要优点有:
- 不需要输入簇的数量
- 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。
- 可以在聚类的同时发现噪声点,对数据集中的噪声点不敏感。
- 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。
DBSCAN的主要缺点有:
- 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
- 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
- 需要调参数,调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。这一点在具体实现时即可发现。
附:西瓜数据集4.0
0.697 0.460
0.774 0.376
0.634 0.264
0.608 0.318
0.556 0.215
0.403 0.237
0.481 0.149
0.437 0.211
0.666 0.091
0.243 0.267
0.245 0.057
0.343 0.099
0.639 0.161
0.657 0.198
0.360 0.370
0.593 0.042
0.719 0.103
0.359 0.188
0.339 0.241
0.282 0.257
0.748 0.232
0.714 0.346
0.483 0.312
0.478 0.437
0.525 0.369
0.751 0.489
0.532 0.472
0.473 0.376
0.725 0.445
0.446 0.459
相关文章:

EAST 自然场景文本检测
自然场景文本检测是图像处理的核心模块,也是一直想要接触的一个方面。刚好看到国内的旷视今年在CVPR2017的一篇文章:EAST: An Efficient and Accurate Scene Text Detector。而且有开放的代码,学习和测试了下。 题目说的是比较高效࿰…

通过httpmodule获取webapi返回的信息
我写了一个webapi,想在module中获取请求的信息和返回的信息,写进log里,以方便以后查询。request信息很容易能拿到,但是返回信息得费一番周折。不多说,上代码 public class ResponseLoggerModule : IHttpModule {privat…

iOS SwiftUI篇-2 UI控件 Text Button Image List
iOS SwiftUI篇-2 UI控件 Text Button Image List Text 显示文本,相当于UILabel import SwiftUIstruct TextContentView: View {var body: some View {//VStack(垂直排列视图)可以将其内部的多个视图,在垂直方向进行等距排列,VStack最多可以容纳十个子视图,VStack(spacin…

numpy和torch数据操作对比
对numpy和torch数据操作进行对比,避免遗忘。 ndarray和tensor import torch import numpy as npnp_data np.arange(6).reshape((2, 3)) torch_data torch.arange(6) # 张量 tensor2array torch_data.numpy()print(\nnumpy array:\n, np_data,\ntorch tensor\n,…

ZooKeeper学习
一、ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过ZooKeeper对分布式系统进行Master选举,来解决分布式系统的单点故障,如图所示。 那么我们继续分析一下,ZooKeeper通过Master选举来帮助分布式系统解决单点故障, 保…

iOS SwiftUI篇-1 项目结构
iOS SwiftUI篇-1 项目结构 介绍Xcode新建的SwiftUI模版项目结构、跟普通Storyboard模版项目的差异、SwiftUI项目的app启动流程、UIScene概念介绍、AppDelegate.swift和Info.plist的差异 1.项目模版 Interface: SwiftUI Life Cycle: UIKit App Delegate Language: Swift Life…

js绑定事件和解绑事件
在js中绑定多个事件用到的是两个方法:attachEvent和addEventListener,但是这两个方法又存在差异性 attachEvent方法 只支持IE678,不兼容其他浏览器addEventListener方法 兼容火狐谷歌,不兼容IE8及以下 addEventListener方法 div.addEventListener(click,fn); div.addEventLi…

基于三维点云数据的主成分分析方法(PCA)的python实现
主成分分析(PCA)获取三维点云的坐标轴方向和点云法向量 # 实现PCA分析和法向量计算,并加载数据集中的文件进行验证import open3d as o3d # import os import numpy as np from scipy.spatial import KDTree# from pyntcloud import PyntClo…

CV02-FCN笔记
目录 一、Convolutionalization 卷积化 二、Upsample 上采样 2.1 Unpool反池化 2.2 Interpolation差值 2.3 Transposed Convolution转置卷积 三、Skip Architecture 3.1 特征融合 3.2 裁剪 FCN原理及实践,记录一些自己认为重要的要点,以免日后遗…

python基础之常用模块
6、TEXT PROCESSING SERVICES :文本处理服务 6.1、re 8、DATA TYPES : 数据类型 8.1、datetime 8.2、collections 8.3、copy 9、 NUMERIC AND MATHEMATICAL MODULES : 数字和数学模块 9.1、random 10、FUNCTIONAL PROGRAMMING MODULES : 函数式编程模块 10.1、iter…

笔记本电脑摄像头实现光流跟踪
看实验室里的师兄在写CSDN,自己也写一个,记录自己的学习进程吧。 研究生从机械转到了毫无基础的SLAM领域。研一半年上课加自学,对SLAM也有一丢丢的了解。最近看光流法时,想到用笔记本电脑的摄像头实现一下,就简单的…

JSON字符串 拼接与解析
常用方式: json字符串拼接(目前使用过两种方式): 1.运用StringBuilder拼接 StringBuilder json new StringBuilder(); json.append("{"); json.append(""uuid":" """ uuid "",&q…

iOS SwiftUI篇-3 排版布局layout
iOS SwiftUI篇-3 排版布局layout swiftUI提供的layout有: ZStack、GeometryReader、HStack、LazyVGrid、LazyHStack、LazyHGrid、LazyVStack、VStack、Spacer、ScrollViewReader等 HStack 水平横向布局容器,子view按顺序水平排列 HStack(alignment: .center, spacing: 10)…

CV04-UNet笔记
目录 一、UNet模型 二、Encoder & Decoder 2.1 Encoder 2.2 Decoder 2.3 classifier 学习U-Net: Convolutional Networks for Biomedical Image Segmentation,记录一些自己认为重要的要点,以免日后遗忘。 代码:https://github.com/…

Scrapy 学习笔记(-)
Scrapy Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 A…

Ubuntu18.04运行ORB_SLAM2
运行环境:Ubuntu18.04 预先安装的库 需要预先安装一些库,如Eign,Sophus,OpenCV等。笔者在阅读《SLAM十四讲》的时候已经安装,在此不再赘述。 ORB_SLAM2源码的下载与编译 git clone https://github.com/raulmur/ORB…

java中的各种流(老师的有道云笔记)
内存操作流-字节之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流。此时得使用内存流完成内存的输入和输出操作。如果程序运行过程中要产生一些临时文件,可采用虚拟文件方式实现;直接操作磁…

iOS SwiftUI篇-4 注解@State、@Binding、@ObservedObject、@EnvironmentObject、@Environment
iOS SwiftUI篇-4 注解@State、@Binding、@ObservedObject、@EnvironmentObject、@Environment @State 关联View的状态,当@State修饰的属性改变时,对应的View会跟着刷新,符合MVVM的设计理念 @State var count: Int = 0Section(header: Text("@States")) {Te
CV05-ResNet笔记
目录 一、为什么是ResNet 二、Residual Learning细节 2.1 shortcut计算 2.2 11卷积调整channel维度大小 2.3 ResNet层数 2.4 ResNet里的Basic Block 和 Bottleneck Block 2.5 Global Average Pooling 全局平均池化 2.6 Batch Normalization 学习ResNet,记录…

二叉树的前序,中序,后序的递归、迭代实现
二叉树的前序遍历 递归实现 递归实现没什么好说的。个人感觉将函数功能看成一个整体,不要去想栈中怎么实现的。毕竟自己的脑袋不是电脑,绕着绕着就蒙了。 void preordered_traversal_recursion(TreeNode* root) {if(root NULL) return;container.pus…

DataSet 动态添加列
public DataSet GetNewId(List<string> IdArr){DataSet ds new DataSet();DataTable newtb new DataTable();DataColumn column new DataColumn("cnt", typeof(string));//新增列newtb.Columns.Add(column);for (int i 0; i < IdArr.Count; i){StringBu…

iOS专题1-蓝牙扫描、连接、读写
iOS专题1-蓝牙扫描、连接、读写 概念 外围设备 可以被其他蓝牙设备连接的外部蓝牙设备,不断广播自身的蓝牙名及其数据,如小米手环、共享单车、蓝牙体重秤 中央设备 可以搜索并连接周边的外围设备,并与之进行数据读写通讯,如手机 日常生活中常见的场景是手机app通过蓝…

CV06-Xception笔记
目录 一、为啥是Xception 二、Xception结构 2.1 Xception结构基本描述 2.2 实现细节 2.3 DeepLabV3改进 三、记录pytorch采坑relu激活函数inplaceTrue Xception笔记,记录一些自己认为重要的要点,以免日后遗忘。 复现Xception论文、DeepLabV改进的…

C++排序算法实现(更新中)
比较排序法:如冒泡排序、简单选择排序、合并排序、快速排序。其最优的时间复杂度为O(nlogn)。 其他排序法:如桶排序、基数排序等。时间复杂度可以达到O(n)。但试用范围有要求。 桶排序:排序的数组元素跨距不能很大。因为跨距很大的话…

iOS SwiftUI篇-5 专题NavigationView、NavigationLink
iOS SwiftUI篇-5 专题NavigationView、NavigationLink NavigationView:标题、展示模式、隐藏导航栏、隐藏返回按钮、添加导航栏按钮 NavigationLink:Text文本跳转、Image图片跳转、Button按钮跳转、点击按钮根据业务跳转到不同页面 NavigationView 标题、展示模式 import S…

PHP artisan
Artisan 是 Laravel 提供的 CLI(命令行接口),它提供了非常多实用的命令来帮助我们开发 Laravel 应用。前面我们已使用过 Artisan 命令来生成应用的 App Key 和控制器。在本教程中,我们会用到以下 Artisan 命令,你也可以…

【转载】Pytorch在加载模型参数时指定设备
转载 https://sparkydogx.github.io/2018/09/26/pytorch-state-dict-gpu-to-cpu/ >>> torch.load(tensors.pt) # Load all tensors onto the CPU >>> torch.load(tensors.pt, map_locationtorch.device(cpu)) # Load all tensors onto the CPU, using a fun…

目标检测之Faster-RCNN的pytorch代码详解(数据预处理篇)
首先贴上代码原作者的github:https://github.com/chenyuntc/simple-faster-rcnn-pytorch(非代码作者,博文只解释代码) 今天看完了simple-faster-rcnn-pytorch-master代码的最后一个train.py文件,是时候认真的总结一下了࿰…

hp-ux 集群,内存 小记
hp-ux 集群,内存 小记 -----查看hp 集群状态信息 # cmviewcl -v CLUSTER STATUS dbsvr up NODE STATUS STATE db01 up running Cluster_Lock_LVM: VOLUM…

iOS SwiftUI篇-6 专题TabView
iOS SwiftUI篇-6 专题TabView TabView: 图片+文字组成tabItem,选中时改变图片和文字颜色 跳转到二级页面时隐藏tabbar,返回到首页时显示tabbar 首页、我的两个tab,效果图: 图片文字组成tabItem,选中时改变图片和文字颜色 代码: struct MainContentView: View {@State…