当前位置:  编程技术>c/c++/嵌入式

用C++实现DBSCAN聚类算法

    来源: 互联网  发布时间:2014-10-15

    本文导语:  这几天由于工作需要,对DBSCAN聚类算法进行了C++的实现。时间复杂度O(n^2),主要花在算每个点领域内的点上。算法很简单,现共享大家参考,也希望有更多交流。 数据点类型描述如下: 代码如下:#include  using namespace std; const...

这几天由于工作需要,对DBSCAN聚类算法进行了C++的实现。时间复杂度O(n^2),主要花在算每个点领域内的点上。算法很简单,现共享大家参考,也希望有更多交流。
 数据点类型描述如下:
代码如下:

#include

 using namespace std;

 const int DIME_NUM=2;        //数据维度为2,全局常量

 //数据点类型
 class DataPoint
 {
 private:
     unsigned long dpID;                //数据点ID
     double dimension[DIME_NUM];        //维度数据
     long clusterId;                    //所属聚类ID
     bool isKey;                        //是否核心对象
     bool visited;                    //是否已访问
     vector arrivalPoints;    //领域数据点id列表
 public:
     DataPoint();                                                    //默认构造函数
     DataPoint(unsigned long dpID,double* dimension , bool isKey);    //构造函数

     unsigned long GetDpId();                //GetDpId方法
     void SetDpId(unsigned long dpID);        //SetDpId方法
     double* GetDimension();                    //GetDimension方法
     void SetDimension(double* dimension);    //SetDimension方法
     bool IsKey();                            //GetIsKey方法
     void SetKey(bool isKey);                //SetKey方法
     bool isVisited();                        //GetIsVisited方法
     void SetVisited(bool visited);            //SetIsVisited方法
     long GetClusterId();                    //GetClusterId方法
     void SetClusterId(long classId);        //SetClusterId方法
     vector& GetArrivalPoints();    //GetArrivalPoints方法
 };

这是实现:
代码如下:

#include "DataPoint.h"

 //默认构造函数
 DataPoint::DataPoint()
 {
 }

 //构造函数
 DataPoint::DataPoint(unsigned long dpID,double* dimension , bool isKey):isKey(isKey),dpID(dpID)
 {
     //传递每维的维度数据
     for(int i=0; idimension[i]=dimension[i];
     }
 }

 //设置维度数据
 void DataPoint::SetDimension(double* dimension)
 {
     for(int i=0; idimension[i]=dimension[i];
     }
 }

 //获取维度数据
 double* DataPoint::GetDimension()
 {
     return this->dimension;
 }

 //获取是否为核心对象
 bool DataPoint::IsKey()
 {
     return this->isKey;
 }

 //设置核心对象标志
 void DataPoint::SetKey(bool isKey)
 {
     this->isKey = isKey;
 }

 //获取DpId方法
 unsigned long DataPoint::GetDpId()
 {
     return this->dpID;
 }

 //设置DpId方法
 void DataPoint::SetDpId(unsigned long dpID)
 {
     this->dpID = dpID;
 }

 //GetIsVisited方法
 bool DataPoint::isVisited()
 {
     return this->visited;
 }

 
 //SetIsVisited方法
 void DataPoint::SetVisited( bool visited )
 {
     this->visited = visited;
 }

 //GetClusterId方法
 long DataPoint::GetClusterId()
 {
     return this->clusterId;
 }

 //GetClusterId方法
 void DataPoint::SetClusterId( long clusterId )
 {
     this->clusterId = clusterId;
 }

 //GetArrivalPoints方法
 vector& DataPoint::GetArrivalPoints()
 {
     return arrivalPoints;
 }

DBSCAN算法类型描述:
代码如下:

#include
 #include

 using namespace std;

 //聚类分析类型
 class ClusterAnalysis
 {
 private:
     vector dadaSets;        //数据集合
     unsigned int dimNum;            //维度
     double radius;                    //半径
     unsigned int dataNum;            //数据数量
     unsigned int minPTs;            //邻域最小数据个数

     double GetDistance(DataPoint& dp1, DataPoint& dp2);                    //距离函数
     void SetArrivalPoints(DataPoint& dp);                                //设置数据点的领域点列表
     void KeyPointCluster( unsigned long i, unsigned long clusterId );    //对数据点领域内的点执行聚类操作
 public:

     ClusterAnalysis(){}                    //默认构造函数
     bool Init(char* fileName, double radius, int minPTs);    //初始化操作
     bool DoDBSCANRecursive();            //DBSCAN递归算法
     bool WriteToFile(char* fileName);    //将聚类结果写入文件
 };

 聚类实现:
代码如下:

#include "ClusterAnalysis.h"
 #include
 #include
 #include

 /*
 函数:聚类初始化操作
 说明:将数据文件名,半径,领域最小数据个数信息写入聚类算法类,读取文件,把数据信息读入写进算法类数据集合中
 参数:
 char* fileName;    //文件名
 double radius;    //半径
 int minPTs;        //领域最小数据个数 
 返回值: true;    */
 bool ClusterAnalysis::Init(char* fileName, double radius, int minPTs)
 {
     this->radius = radius;        //设置半径
     this->minPTs = minPTs;        //设置领域最小数据个数
     this->dimNum = DIME_NUM;    //设置数据维度
     ifstream ifs(fileName);        //打开文件
     if (! ifs.is_open())                //若文件已经被打开,报错误信息
     {
         cout tempDimData[j];
         }
         tempDP.SetDimension(tempDimData);    //将维度信息存入数据点对象内

 //char date[20]="";
 //char time[20]="";
         ////double type;    //无用信息
         //ifs >> date;
 //ifs >> time;    //无用信息读入

         tempDP.SetDpId(i);                    //将数据点对象ID设置为i
         tempDP.SetVisited(false);            //数据点对象isVisited设置为false
         tempDP.SetClusterId(-1);            //设置默认簇ID为-1
         dadaSets.push_back(tempDP);            //将对象压入数据集合容器
         i++;        //计数+1
     }
     ifs.close();        //关闭文件流
     dataNum =i;            //设置数据对象集合大小为i
     for(unsigned long i=0; i

    
 
 

您可能感兴趣的文章:

  • Base64编码原理详解及c++编码解码实现
  • 我实现了个J2EE技术的服务器,支持TCP、UDP和数据库,由于性能的原因,需要改为C或C++实现,我是C、C++新手,我该如何入手呢?看什么样的
  • c++实现MD5算法代码示例
  • java 与 C++ 实现后绑定的方法
  • c++通用模板类(template class)定义实现详细介绍
  • Qt实现的C++框架 qtioccontainer
  • 用C或C++实现主存的分配与回收
  • 在linux系统上,如何用C++实现获取和设置系统时间?
  • 文本压缩算法C++实现 Golden Huffman
  • C++标准库实现 libc++
  • C++的XMLRPC实现 XMLRPC++
  • Java/JavaScript API 的 C++ 实现 libj
  • c++ 连接两个字符串实现代码 实现类似strcat功能
  • c++在unix中如何实现CString的方法?或者说有没有替换CString的类?
  • 请问:java中如何实现C++中的sizeof()方法?
  • 用C或C++编程,模拟可变分区存储管理且首次适应的算法实现存储器的分配与回收
  • vim中如何实现c++代码编写的自动格式化和语法高亮的功能?
  • C++实现CreatThread函数主线程与工作线程交互的方法
  • 请教为什么在C++编译通过并实现的程序,在linux下就会出错
  • linux下c++怎样实现回调(CALLBACK)函数?
  • 在linux下如何用c++实现建立一个文件夹
  • boost unordered_map和std::list相结合的实现LRU算法
  • 那位高人有任务分配问题的禁忌搜索算法、模拟退火算法的算法实现程序啊
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • 【算法】扑克发牌算法实现
  • c语言实现MD5算法完整代码示例
  • C++实现查找中位数的O(N)算法和Kmin算法
  • MD5算法的C语言实现
  • 有没谁对pagerank算法实现有了解?
  • 有没有函数实现压缩算法?
  • 最短路径算法实现 k-shortest-paths
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • iphone cocos2d 精灵的动画效果(图片,纹理,帧)CCAnimation实现
  • linux下如实现与window下的驱动器实现文件共享??
  • c语言判断某一年是否为闰年的各种实现程序代码
  • qt如何实现:操作键盘实现数据的滚动?
  • html<pre>标签自动换行实现方法
  • 我想用APPLET实现读取客户端的图片文件,该如何实现?
  • 网站重定向用C语言实现iptables,ACL实现 iis7站长之家
  • PING是用TCP,还是用UDP来实现的?或是采用其它协议实现的?




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3