DBSCAN算法

gogozqf 2011-08-29 10:59:53
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <fstream>
#include <cmath>
using namespace std;

#define PROCNUM 3 //属性个数
#define RECNUM 10 //样本点记录个数
#define e 4 //半径大小
#define MINPTS 2 //MINPTS值

struct record //记录的数据结构
{
int num; //样本点编号
int prop1; //属性1,下同
int prop2;
int prop3;
};


void Remove_Space(string& str) //消除字符串中的空格
{
int i=0;
while(i!=str.size())
{
if(str[i]==' ')
str.erase(i,1);
i++;
}
}

int ctoi(char ch) //字符转换为整形
{
return ch-48;
}

void ReadToVector(vector<record> &rvec,ifstream& in) //从文件中读取样本数据到容器中
{
string str;
int t=0;
while(getline(in,str)) //每行读取
{
Remove_Space(str); //消除字符串空格
record r;
if(t==9)
r.num=10;
else
r.num=ctoi(str[0]);
r.prop1=ctoi(str[1]);
r.prop2=ctoi(str[2]);
r.prop3=ctoi(str[3]);
rvec.push_back(r); //读取到容器
t++;
}
}

vector<int> getProp(record r) //以容器的方式返回样本属性值,方便下面的操作
{
vector<int> pvec;
pvec.push_back(r.prop1);
pvec.push_back(r.prop2);
pvec.push_back(r.prop3);
return pvec;
}

void dbscan(vector<record>& rvec,int *kind) //dbscan算法,输入参数为样本容器,以及kind数组
{
int i;
for(i=1;i<RECNUM;i++)
{
if(kind[i]==0) //深度优先顺序遍历容器
{
int rec[PROCNUM]; //存放属性
int temp[PROCNUM]; //临时存放其余样本的属性
int nearid[RECNUM]; //存放一个聚类的样本点
int near_t=0; //计算聚类样本个数
int j;
for(j=0;j<RECNUM;j++)
nearid[j]=0;
vector<int> provec=getProp(rvec[i-1]);
for(j=0;j<PROCNUM;j++)
rec[j]=provec[j];
vector<record>::iterator iter=rvec.begin();
while(iter!=rvec.end())
{
if(kind[iter->num]==0)
{
provec=getProp(*iter);
for(j=0;j<PROCNUM;j++)
temp[j]=provec[j];
int E=0;
for(j=0;j<PROCNUM;j++)
E+=pow(rec[j]-temp[j],2);
//cout<<E;
if(E<pow(e,2))
nearid[near_t++]=iter->num; //小于半径,划分到聚类
}
iter++;
}
if(near_t>MINPTS) //是核心对象
{
cout<<"对象"<<i<<"是核心对象,以下是聚类点:"<<endl;
char strFn[80];
sprintf(strFn,"cluster%d.txt",i);
ofstream out(strFn);
string strFn1(strFn);
if(!out)
cout<<"无法建立"<<strFn1<<"文件"<<endl;
else
{
out<<rvec[i].num<<","<<rvec[i].prop1<<","<<rvec[i].prop2<<","<<rvec[i].prop3<<endl;
}
int j=0;
while(nearid[j]!=0)
{
kind[nearid[j]]=i;
cout<<nearid[j]<<",";
if(out)
out<<rvec[j].num<<","<<rvec[j].prop1<<","<<rvec[j].prop2<<","<<rvec[j].prop3<<endl;
j++;
}
cout<<endl<<"该聚类对象个数:"<<j<<endl;
}
}
}
}

void main()
{
string fn;
cout<<"enter the filename:";
cin>>fn;
ifstream in(fn.c_str());
if(!in)
{
cout<<"无法打开文件!"<<endl;
return;
}
vector<record> rec_vec;
int kind[RECNUM+1];
int i;
for(i=1;i<=RECNUM;i++)
kind[i]=0;
ReadToVector(rec_vec,in);
dbscan(rec_vec,kind);
cout<<"以下是孤立点:"<<endl;
for(i=1;i<=RECNUM;i++)
if(kind[i]==0)
cout<<i<<",";
cout<<endl;
}
请DX们讲解一下这个程序中DBSCAN算法那块儿,看了半天看不懂啊!谢了!!!
...全文
386 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
maccie 2014-04-12
  • 打赏
  • 举报
回复
这个如何讲解?
qq1272692827 2012-06-04
  • 打赏
  • 举报
回复
不错
顶起
仙度瑞城 2011-08-29
  • 打赏
  • 举报
回复
我也没看懂..帮你顶起..让大侠来..
aeolus_boy 2011-08-29
  • 打赏
  • 举报
回复
帮顶;。。。。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧