DBscan算法C++实现

#include<bits/stdc++.h>
#define dimense 10
//10维数据
#define N 5005
#define MAX 0xffffff
#define clr(a) memset(a,0,sizeof(a))
using namespace std;
double radius=60;
int min_num=400;
int num=5000;//数据量
int k;
int now=0;//当前是第几个簇
int ans=0;//不是离群点的簇的数目

struct Point{
    int id;
    double dir[dimense];
    int belong;
    bool iskey;
    bool vis;
    int rec;//统计多少个点在其区域内
    vector<int>area;
};
Point center[15];
vector<Point>data;
vector<int>save[15];

double dis(Point a,Point b){
    double ret=0;
    for(int ii=0;ii<dimense;ii++){
        ret+=(a.dir[ii]-b.dir[ii])*(a.dir[ii]-b.dir[ii]);
    }
    return sqrt(ret);
}
int cnt=0;//已访问过的总数

void DBscan(int cur){
    int i,j;
    if(data[cur].vis)return;
    data[cur].vis=true;
    data[cur].belong=now;
    cnt++;
    for(i=0;i<num;i++){
        if(data[i].vis)continue;
        if(dis(data[i],data[cur])<radius){
            data[cur].area.push_back(i);
            data[i].belong=now;
            data[cur].rec++;
        }
    }
    if(data[cur].rec>min_num){
        data[cur].iskey=true;
        for(i=0;i<data[cur].rec;i++){
            DBscan(data[cur].area[i]);
        }
    }else data[cur].iskey=false;
}
set<int>tot;
int vis2[N];
void dfs(int a){
    if(vis2[a])return;
    vis2[a]=1;
    save[now].push_back(a);
    for(int i=0;i<data[a].rec;i++)
        dfs(data[a].area[i]);
}
int main(){
    clr(vis2);
    int i,j;
    freopen("In.txt","r",stdin);
    freopen("Out2.txt","w",stdout);
    for(i=0;i<num;i++){
        Point t;
        t.vis=false;
        t.id=i;
        t.rec=0;
        for(j=0;j<dimense;j++)
            scanf("%lf",&t.dir[j]);
        data.push_back(t);
    }
    for(i=0;i<num;i++)
        if(!data[i].vis){
            DBscan(i);
            now++;
        }
    now=0;
    for(i=0;i<num;i++){
        if(!vis2[i]){
            dfs(i);
            now++;
        }
    }
    ans=0;
    int tmp_rec[N];
    for(i=0;i<now;i++){
        if(save[i].size()>min_num)tmp_rec[ans++]=i;
    }
    printf("一共%d个簇\n共:%d点\n",ans,cnt);
    for(i=0;i<ans;i++){
        int len=save[tmp_rec[i]].size();
        printf("第%d个簇有%d个点",i+1,len);
        for(j=0;j<len;j++){
            printf("%d%c",save[tmp_rec[i]][j],j==len-1?'\n':' ');
        }
    }
    return 0;
}

复制去Google翻译翻译结果

时间: 2024-08-01 00:33:30

DBscan算法C++实现的相关文章

基于密度的聚类之Dbscan算法

一.算法概述 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类(笔者认为是因为他不是基于距离的,基于距离的发现的是球状簇). 该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其他空间对象)的数目不小于某一给

DBSCAN算法

一.基于密度的聚类算法简介 DBSCAN是数据挖掘中最经典基于密度的聚类算法. 基于密度的聚类算法的核心是,通过某个点r邻域内样本点的数量来衡量该点所在空间的密度.和k-means算法的不同的是: 1.可以不需要事先指定cluster的个数. 2.可以找出不规则形状的cluster. 二.DBSCAN算法思想 该算法的参数是:r 和minPts r:表示某点领域的阈值. minPts:表示某点r邻域范围内样本点的数量. 核心点:若某点r邻域内样本点的数量不小于minPts,则该点就是核心点. 圆

数据挖掘算法:DBSCAN算法的C++实现

(期末考试快到了,所以比较粗糙,请各位读者理解..) 一.    概念 DBSCAN是一种产生划分聚类的基于密度的聚类算法,簇的个数由算法自动地确定.低密度区域中的点被视为噪声而忽略,因此DBSCAN不产生完全聚类. 二.    伪代码 1    将所有点标记为核心点.边界点和噪声点. 2    删除噪声点. 3    为距离在Eps之内的所有核心点之间赋予一条边. 4    每组连通的核心点形成一个簇. 5    将每个边界点指派到一个与之关联的核心点的簇中. 三.    重要数据结构 1  

【转】常用聚类算法(一) DBSCAN算法

原文链接:http://www.cnblogs.com/chaosimple/p/3164775.html#undefined 1.DBSCAN简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法.该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合. 该算法利用基于密度的聚类的概念,即要求

聚类分析二:DBSCAN算法

一.基本概念 dbscan算法 核心对象(A):若某个点的密度达到算法设定的阈值则其为核心点(即r邻域内点的数量不小于minPts) 邻域的距离阈值:设定的半径r 直接密度可达:若某点p在点q的r邻域内且q是核心点,则p-q是直接密度可达(核心对象,在邻域内) 密度可达:若有一个点的序列q0.q1....qk,对任意qi-qi-1是直接密度可达,则称从q0到qk密度可达,这实际是直接密度可达的传播(直接密度可达传播) 密度相连:若从某核心点p出发,点q和点k都是密度可达的,则称点q和点k是密度相

机器学习--聚类系列--DBSCAN算法

DBSCAN算法 基本概念:(Density-Based Spatial Clustering of Applications with Noise) 核心对象:若某个点的密度达到算法设定的阈值则其为核心点.(即 r 邻域内点的数量不小于 minPts) ε-邻域的距离阈值:设定的半径r 直接密度可达:若某点p在点q的 r 邻域内,且q是核心点则p-q直接密度可达. 密度可达:若有一个点的序列q0.q1....qk,对任意qi-qi-1是直接密度可达的,则称从q0到qk密度可达,这实际上是直接密

基于密度聚类的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算法实现---Python

生活不易啊,公司考核,初步写出来了,脑阔疼... 思路: 设定阈值与半径: 计算点之间的距离(欧式距离实现): 区分核心点.边界点与离群点: 将每个点的领域作为一个类(即将密度可达的点归为一个簇): 找出每个独立的领域: 对最后的聚类进行标记: 可视化. 代码实现: 1.设定eps = 2,MinPts  = 3: 2.实现点与点欧氏距离的计算 1 def ecludDist(x,y): 2 return np.sqrt(sum(np.sqrt(np.array(x) - np.array(y)

5.无监督学习-DBSCAN聚类算法及应用

DBSCAN方法及应用 1.DBSCAN密度聚类简介 DBSCAN 算法是一种基于密度的聚类算法: 1.聚类的时候不需要预先指定簇的个数 2.最终的簇的个数不确定DBSCAN算法将数据点分为三类: 1.核心点:在半径Eps内含有超过MinPts数目的点. 2.边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内的点. 3.噪音点:既不是核心点也不是边界点的点. 如下图所示:图中黄色的点为边界点,因为在半径Eps内,它领域内的点不超过MinPts个,我们这里设置的MinPts为5