用C实现DBSCAN,完全就是暴力模拟,用三个向量存储核心点、噪声点、边界点,先标记核心点,之后先对核心点进行聚类,将在规定范围内的核心点放入一个向量,这时得到的聚类是包含重复的,再将这个暂时得到的核心点聚类进行合并,这时得到的是核心点的分类,且这个分类包含了间接密度可达的核心点,下一步只需要将边界点加到核心点的分类中就可以。过程暴力,时间复杂度怕是要暴。

#include <bits/stdc++.h>
using namespace std;
/*
12 1 4
1 0
4 0
0 1
1 1
2 1
3 1
4 1
5 1
0 2
1 2
4 2
1 3
*/
int Eps; //邻域半径值
int MinPts; //邻域密度阈值
int N;//点个数 int len[1005];//暂存簇中核心点的个数
int point[1005][2]; // 保存所有的数据点vector<int> kernel_point; // 核心点
vector<int> border_point; // 边界点
vector<int> noise_point; // 噪声点vector<vector<int> > mid; // 可能存在重叠的簇
vector<vector<int> > cluster; // 最终形成的簇int main()
{scanf("%d %d %d",&N,&Eps,&MinPts);for(int i=0;i<N;i++)scanf("%d %d",&point[i][0],&point[i][1]);// 标记核心点for(int i=0; i<N; i++) {int num = 0;for(int j=0; j<N; j++)if(pow(point[i][0]-point[j][0],2)+pow(point[i][1]-point[j][1],2)<=pow(Eps,2)) num++;if(num>=MinPts)kernel_point.push_back(i);}for(int i=0; i<N; i++) {// 边界点或噪声点不能是核心点int flag=0;for(int j=0; j<kernel_point.size();j++) {if(i==kernel_point[j]) {flag=1;break;}    }   if(flag==0){int flag2=1;for(int j=0;j<kernel_point.size();j++) {int s=kernel_point[j];//在任何一个核心点范围内的为边缘点,不在为噪声点 if(pow(point[i][0]-point[s][0],2)+pow(point[i][1]-point[s][1],2)<=pow(Eps,2)) {flag2=0;border_point.push_back(i);break;} }if(flag2==1)noise_point.push_back(i);}}// 将核心点进行聚类 得到可能会重叠的聚类 for(int i=0; i<kernel_point.size(); i++) {int x = kernel_point[i];vector<int> record;record.push_back(x);for(int j=i+1; j<kernel_point.size(); j++) {int y=kernel_point[j];if(pow(point[x][0]-point[y][0],2)-pow(point[x][1]-point[y][1], 2)<pow(Eps, 2))record.push_back(y);}mid.push_back(record);}//将重复的核心点聚类合并 ,即实现了间接密度可达中核心点的跳跃 for(int i=0; i<mid.size(); i++) {if(mid[i][0] == -1)continue;//如果核心点范围内没有其他核心点就不进行合并 for(int j=0; j<mid[i].size(); j++) { for(int x=i+1; x<mid.size(); x++) {if(mid[x][0]==-1) continue;//如果核心点范围内没有其他核心点就不进行合并 for(int y=0;y<mid[x].size();y++) {if(mid[i][j]==mid[x][y]) {// 如果有一样的元素,应该放入一个核心点范围中for(int a=0; a<mid[x].size(); a++) {mid[i].push_back(mid[x][a]);mid[x][a] = -1;}break;}}}}cluster.push_back(mid[i]);//cluster目前保存的是核心点的分组 }// 删除cluster中的重复元素for(int i=0; i<cluster.size(); i++) {for(int j=0; j<cluster[i].size(); j++) {for(int k=j+1; k<cluster[i].size(); k++) {if(cluster[i][j] == cluster[i][k]) {cluster[i].erase(cluster[i].begin()+k);k--;}}}}//分配边界点 for(int i=0;i<cluster.size();i++)len[i]=cluster[i].size();for(int i=0; i<border_point.size(); i++) { int x = border_point[i];for(int j=0; j<cluster.size(); j++) { int flag=0;for(int k=0;k<len[j];k++) {int y = cluster[j][k];if(pow(point[x][0]-point[y][0],2)+pow(point[x][1]-point[y][1], 2)<=pow(Eps,2)) {cluster[j].push_back(x);flag=1;break;}}if(flag==1)break;}}//输出结果 cout<<"Kernel Points : "<<endl;for(int i=0; i<kernel_point.size(); i++) cout<<kernel_point[i]+1<<"\t";cout<<endl<<endl;cout<<"Border Points : "<<endl;for(int i=0; i<border_point.size(); i++)cout<<border_point[i]+1<<"\t";cout<<endl<<endl;cout<<"Noise Points : "<<endl;for(int i=0; i<noise_point.size(); i++)cout<<noise_point[i]+1<<"\t";cout<<endl<<endl;cout<<"Cluster : "<<endl;for(int i=0; i<cluster.size(); i++) {cout<<"第"<<i+1<<"个"<<"\t";int temp=cluster[i].size();sort(cluster[i].begin(),cluster[i].end()) ;for(int j=0; j<cluster[i].size(); j++)cout<<cluster[i][j]+1<<"\t";cout<<endl;}return 0;
}

数据挖掘原理与算法 DBSCAN相关推荐

  1. 数据挖掘原理与算法:对森林火灾影响因素的分析

    数据挖掘原理与算法:对森林火灾影响因素的分析 一.介绍 Forest Fire Area Prediction of the burnt area by forest fires Overview T ...

  2. 数据挖掘原理与算法:机器学习->{[sklearn. model_selection. train_test_split]、[h2o]、[网格搜索]、[numpy]、[plotly.express]}

    数据挖掘原理与算法:机器学习->{[sklearn. model_selection. train_test_split].[h2o].[网格搜索].[numpy].[plotly.expres ...

  3. 数据挖掘原理与算法:练习题2

    数据挖掘原理与算法:练习题2 题目: 下表给出了一组有关天气状况和能否进行户外活动的数据.请给出所有包含属性"Play"的频繁项集(最小支持度计数为3) No. Outlook T ...

  4. 数据挖掘原理与算法:Jupyter

    数据挖掘原理与算法:Jupyter 一.认识Jupyter Jupyter介绍和使用 中文版 PIP(Python包管理工具) anaconda(开源的Python发行版本) Python,Anaco ...

  5. 数据挖掘原理与算法:练习题1

    数据挖掘原理与算法:练习题1 题目: 考虑下表中的数据集,其中A.B.C为属性,+.-为类标号,构建一个决策树 A B C Number of instances + - T T T 5 0 F T ...

  6. 数据挖掘原理与算法_资料 | 数据挖掘:概念、模型、方法和算法(第2版)/ 国外计算机科学经典教材...

    下载地址: 以下书籍介绍来自图书商城 内容简介 · · · · · · 随着数据规模和复杂度的持续上升,分析员必须利用更高级的软件工具来执行间接的.自动的智能化数据分析.<数据挖掘:概念.模型. ...

  7. 数据挖掘原理与算法_技术分享|大数据挖掘算法之FPGrowth算法

    程一舰 数据技术处 我们常说我们生活在信息时代,实际上,我们更多的还是生活在数据时代.因为从过去到现在累积了大量的数据,对数据的挖掘和分析也仅是从最近几年大数据和人工智能技术的发展而兴起.我们对现有数 ...

  8. 数据挖掘原理与算法 K-Means算法

    K-Means算法用于实现聚类需求,以K为参数,把N个对象分为个簇,以使簇内具有较高的相似度. 具体实现上主要是一个循环找质心的过程,大体思路是先预处理数据,将所有点看成一个簇,找这个簇的质心,再选取 ...

  9. 数据挖掘原理与算法 kNN算法

    用于在不清楚具体分组的情况下,给待分配数据分一个组,遍历一遍所有数据即可实现,先选择前面的k个元素作为训练基础,再用后面的数据和待分配数据结合,根据距离不断替换集合里面的元素,最后得到分组,代码并不难 ...

最新文章

  1. nginx——location 优先级
  2. android系统账户管理(AccountManagerService+AccountAuthenticator)
  3. C:\Python27\python.exe: can't open file '2.py': [Errno 2] No such file or directory
  4. 《PHP和MySQL Web开发从新手到高手(第5版)》一一第1章 安装
  5. jquery--- 属性和样式的操作 设置和获取HTML、文本和值、焦点事件
  6. 【渝粤教育】广东开放大学 性考 形成性考核 (33)
  7. Linux查看与修改时区、时间的命令
  8. php生成超链接完整代码_PHP自动把网站自动添加超链接怎么写
  9. UnityShader14.1:透明效果实现(下)
  10. ipsec穿越NAT功能的配置
  11. win10系统如何安装Oracle 10G
  12. 天梯赛 L2-001 紧急救援 (25 分)详细注释
  13. Android Hybrid 方案之 离线文件加载
  14. namecheap namesilo 域名需要备案吗
  15. 人际关系中的万有引力
  16. windows无法连接到某个wifi_Windows无法连接到无线网络的解决办法
  17. 容斥原理和概率与数学期望
  18. Excel查找2列相同的数据,并且返回对应列的另1列数据
  19. windows10根据背景颜色自动调节屏幕亮度/色彩对比度
  20. 征途研发元老披露成功内幕

热门文章

  1. 文件上传中的临时上传路径问题
  2. 鼠标浮动到表格的某行 背景颜色变化[mouseover mouseout 以及mouseenter mouseleave]
  3. Rect 的相关操作
  4. ValidateRequest=false 不在.net2.0 中该怎么办?
  5. Centos下安装JDK环境配置
  6. CF1228C. Primes and Multiplication(数学)
  7. 设计模式全解析 23种
  8. Java中数学计算的相关方法
  9. 阿里云服务器linux系统上安装git版本控制系统
  10. 【Codeforces】894E.Ralph and Mushrooms Tarjan缩点+DP