-
前言
最近老师布置的作业中含有Borderline-SMOTE算法,而k-means算法是其基础,我需要将论文中的模型改造为自己的模型,从论文中的伪代码写出自己的框架,下面是自己动手热身实现的第一版k-means算法,很简单,如有错误请多多指教。 -
k-means算法
该算法很简单,开始时随机选取k个核心,利用欧式距离不断将数据集的样本进行分类,直至核心不在变化或者收敛为止。本篇博客重点在于算法实现,如果不明白算法实现可以实际计算一遍,就会恍然大悟,没有比这更简单的算法了。 -
函数运行流程
- 数据格式
文本的第一行分别为数据的行数和列数,从第二行起为数据集。
- 函数定义
根据面向对象的编程方式,将k-means函数的过程拆分为5个函数,方便调用。
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <math.h>
#define ROW 10000
#define COLUMN 10
#define MAX 10
double data[ROW][COLUMN]; //支持的最大数据量
double core[MAX][COLUMN]; //最大支持K 10
double old_core[MAX][COLUMN]; //用于判断程序结束
double threshold = 0.0001 ; // 阈值
int _row = 0; //记录真实数据的行数
int _column = 0 ; //记录真实数据的列数
int k = 0 ;
using namespace std;
void readFile(string ); //进行读取数据
void k_means(); //算法函数
void initCore(); //初始化k个核心
double getDistance(int,int); //计算样本与核心之间的距离
void classify(); //对数据集进行归类
void adjustCore(); //调整核心
bool isOver(); //判断核心是否收敛
void saveFile(); //保存数据
- readFile和saveFile函数
readFile函数,代码中的_row和_column变量在读取文件时进行赋值,这样做是为了编程方便。
void readFile(string path)
{
ifstream input ;
input.open(path,iostream::in);
if(!input.is_open())
{
cout << "文件读取失败" << endl;
exit(-1);
}
input >> _row ;
input >> _column ;
for(int i=0;i < _row ;i++