简单实现k-means算法

本文介绍了作者在完成作业过程中实现的k-means算法。博客详细讲解了算法的原理和实现过程,包括如何初始化核心、分类数据、调整核心、判断收敛以及计算距离。通过面向对象的方式将算法拆分为多个函数,便于理解和调用。并提供了测试样本集Iris数据集的链接和源代码的百度网盘下载链接。
摘要由CSDN通过智能技术生成
  • 前言
    最近老师布置的作业中含有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++
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值