资源简介
采用C++ 实现基于密度聚类算法DBScan的实现
代码片段和文件信息
#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 << “Error opening file“; //输出错误信息
exit(-1); //程序退出
}
unsigned long i = 0; //数据个数统计
while (!ifs.eof()) //从文件中读取POI信息,将POI信息写入POI列表中
{
DataPoint tempDP; //临时数据点对象
double tempDimData[DIME_NUM]; //临时数据点维度信息
for (int j = 0; j {
ifs >> 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
cout << “总数据量: “ << dataNum << “ 条“ << endl;
for (unsigned long i = 0; i {
SetArrivalPoints(dadaSets[i]); //计算数据点领域内对象
}
return true; //返回
}
/*
函数:将已经过聚类算法处理的数据集合写回文件
说明:将已经过聚类结果写回文件
参数:
char* fileName; //要写入的文件名
返回值: true */
bool ClusterAnalysis::WriteToFile(char* fileName)
{
ofstream of1(fileName); //初始化文件输出流
for (unsigned long i = 0; i {
for (int d = 0; d of1 << dadaSets[i].GetDimension()[d] << ‘\t‘;
of1 << dadaSets[i].GetClusterId() << endl; //将所属簇ID写入文件
}
of1.close(); //关闭输出文件流
return true; //返回
}
/*
函数:设置数据点的领域点列表
说明:设置数据点的领域点列表
参数:
返回值: true; */
void ClusterAnalysis::SetArrivalPoints(DataPoint& dp)
{
for (unsigned long i = 0; i {
double distance = GetDistance(dadaSets[i] dp); //获取与特定点之间的距离
if (distance <= radius && i != dp.GetDpId()) //若距离小于半径,并且特定点的id与dp的id不同执行
dp.GetArrivalPoints().push_back(i); //将特定点id压力dp的领域列表中
}
if (dp.GetArrivalPoints().size() >= minPTs) //若dp领域内数据点数据量> minPTs执行
{
dp.SetKey(true); //将dp核心对象标志位设为true
return; //返回
}
dp.SetKey(false); //若非核心对象,则将dp核心对象标志位设为false
}
/*
函数:执行聚类操作
说明:执行聚类操作
参数:
返回值: true; */
bool ClusterAnalysis::DoDBSCANRecursive()
{
unsigned long clusterId = 0; //聚类id计数,初始化为0
for (unsig
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5901 2016-07-09 11:38 dbscan\dbscan\ClusterAnalysis.cpp
文件 932 2016-07-08 23:07 dbscan\dbscan\ClusterAnalysis.h
文件 1348 2016-07-07 21:26 dbscan\dbscan\DataPoint.cpp
文件 1296 2016-07-07 21:24 dbscan\dbscan\DataPoint.h
文件 3528 2016-11-15 21:49 dbscan\dbscan\dbscan.cpp
文件 3698 2016-11-15 10:22 dbscan\dbscan\dbscan.vcxproj
文件 1358 2016-07-08 23:01 dbscan\dbscan\dbscan.vcxproj.filters
文件 164 2016-09-21 15:50 dbscan\dbscan\dbscan.vcxproj.user
文件 1820 2016-09-21 17:08 dbscan\dbscan\Debug\cl.command.1.tlog
文件 22016 2016-09-21 17:08 dbscan\dbscan\Debug\CL.read.1.tlog
文件 1032 2016-09-21 17:08 dbscan\dbscan\Debug\CL.write.1.tlog
文件 427688 2016-11-15 10:22 dbscan\dbscan\Debug\ClusterAnalysis.obj
文件 59178 2016-11-15 10:22 dbscan\dbscan\Debug\DataPoint.obj
文件 51 2016-09-21 17:10 dbscan\dbscan\Debug\dbscan.lastbuildstate
文件 2265 2016-11-15 16:05 dbscan\dbscan\Debug\dbscan.log
文件 193442 2016-11-15 16:05 dbscan\dbscan\Debug\dbscan.obj
文件 3404 2016-11-15 16:05 dbscan\dbscan\Debug\dbscan.tlog\cl.command.1.tlog
文件 34170 2016-11-15 16:05 dbscan\dbscan\Debug\dbscan.tlog\CL.read.1.tlog
文件 1466 2016-11-15 16:05 dbscan\dbscan\Debug\dbscan.tlog\CL.write.1.tlog
文件 158 2016-11-15 16:05 dbscan\dbscan\Debug\dbscan.tlog\dbscan.lastbuildstate
文件 4320 2016-11-15 16:05 dbscan\dbscan\Debug\dbscan.tlog\li
文件 7446 2016-11-15 16:05 dbscan\dbscan\Debug\dbscan.tlog\li
文件 534 2016-11-15 16:05 dbscan\dbscan\Debug\dbscan.tlog\li
文件 2 2016-09-21 17:08 dbscan\dbscan\Debug\li
文件 2 2016-09-21 17:08 dbscan\dbscan\Debug\li
文件 2 2016-09-21 17:08 dbscan\dbscan\Debug\li
文件 2 2016-09-21 17:08 dbscan\dbscan\Debug\li
文件 2994 2016-09-21 17:08 dbscan\dbscan\Debug\li
文件 7456 2016-09-21 17:08 dbscan\dbscan\Debug\li
文件 498 2016-09-21 17:08 dbscan\dbscan\Debug\li
............此处省略19个文件信息
评论
共有 条评论