聚类算法c++代码实现(DBSCAN)

本文详细介绍了DBSCAN聚类算法的C++实现,包括代码优化,支持处理多维数据,以及边界点、核心点和噪音点的准确分类。通过读取xx.txt文件,输出clustering.txt结果文件,展示了算法在不同维度数据上的应用,如dataPoint2.txt和dataPoint4.txt的测试数据。

代码原始出处:http://blog.youkuaiyun.com/k76853/article/details/50440182zhouxianen,20170322
修改:

  • 能准确分类边界点、核心点和噪音点,并输出
  • 维度扩展,原来程序只能读取、聚类和显示二维特征数据,扩展后,可以处理n维数据
  • 定义了init()函数初始化化类成员变量(也可以不用)
  • 领域半径eps判断条件修改为小于等于,这是为保证与matlab版本形式一致

输入数据类型:xx.txt文件

输入txt文件格式如下(数据维度可以是n维):
1.400000,0.200000
1.400000,0.200000
1.300000,0.200000

输出结果:控制台输出,同时输出clustering.txt文件 输出txt文件格式如下:
1.4,0.2,1
1.4,0.2,1
1.3,0.2,1 其中第三列为分类标记,数据之间用逗号分开 本文件中附上了两组组测试数据和测试结果(测试数据来源:http://yarpiz.com/255/ypml110-dbscan-clustering)
二维测试数据:dataPoint2.txt 四维测试数据:dataPoint4.txt
输出结果:clustering2.txt,clustering4.txt (eps=0.25,MinPts=3时结果)

#include "DBSCAN.h"

int main(int argc, char** argv) {
   
   
	vector<point> dataset = openFile("788points.txt");
	DBSCAN(dataset, 1.2,4);
	//cout << pointType_UNDO << pointType_NOISE
	//	<<pointType_BORDER
	//	<<pointType_CORE << endl;

	return 0;
}
//#if !defined(_DBSCAN_H_INCLUDED_)
//#define _DBSCAN_H_INCLUDED_

#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <limits>
#include <cmath>
#include <stack>
#include <map>

using namespace std;

enum//枚举类型默认值为0-3
{
   
   
	pointType_UNDO,
	pointType_NOISE,//噪声
	pointType_BORDER,//边界点
	pointType_CORE//核心点

};



class point {
   
   
public:
	float x;
	float y;//~x,y坐标
	vector<float> xn;
	//vector<float> yn;
	int cluster;//第几个簇
	int pointType;  //1 noise 2 border 3 core
	int pts;        //每个点周围包含的点数
	int corePointID;//核心点的标号
	vector<int> corepts;
	int  visited;//点是否被遍历,1代表被遍历,0代表没被遍历
	void init();//初始化
	//point();
	//point(float a, float b, int c) {
   
   
	//	x = a;
	//	y = b;
	//	cluster = c;
	//};
	point(vector<float>  an, int c) {
   
   //three or more dimension
		this->xn = an;
		this->cluster = c;//
	};
};


float stringToFloat(string i);//把字符串转换为浮点数
vector<point> openFile(const char* dataset);//打开文件
float squareDistance(point a, point b);//计算距离
float squareDistanceVect(point a, point b);////多维数据算欧氏距离
void DBSCAN(vector<point> dataset, float Eps, int MinPts);


//#endif

#include "DBSCAN.h"
//#include "DBSCAN.h"

int clusterID = 0;

void point::init
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值