K均值算法实现
运行环境:Ubuntu+Code::Blocks(G++)
K-均值:在D(数据集)中随机地选择k个对象,每个对象代表一个簇的初始均值或中心。对剩下的每个对象,根据其与各个簇中心的欧式距离,将它分配到最相似的簇中。(不能保证k-均值方法收敛于全局最优解,并且它常常终止于一个局部最优解。可以不同的初始簇中心,多次运行k-均值算法。)
代码为3个簇,初始的簇中心为输入的前三个点。(代码是六七月份写的,直接放上来。)
#include <iostream>
#include <vector>
#include <cmath>
#include <fstream>
#include <cstdlib>
#define OP ','
#define SET_SIZE 3 //簇的个数 using namespace std;
const double EXP = 1e-;//用于判断新的中心点与原中心点的距离,如果比exp要小则说明聚类结束 //定义的点的坐标
typedef struct point
{
double xAxle;
double yAxle;
point()
{
xAxle = ;
yAxle = ;
}
point(double _x,double _y)
{
xAxle = _x;
yAxle = _y;
}
}Point; //读取文件里面的内容,到numSave数组里面去
void readFile(ifstream &inFile,const string &fileName,vector<Point> &numSave)
{
inFile.clear(); inFile.open(fileName.c_str());
if(!inFile)
{
cout << "无法打开输入文件!" << endl;
} //一行一行的读取
string temp;
while(getline(inFile,temp))
{
//文件里面一行是一个坐标点
double x = atof(temp.substr(,temp.find(OP)).c_str());
double y = atof(temp.substr(temp.find(OP) + ,temp.size()-).c_str()); numSave.push_back(Point(x,y));
} inFile.close();
} //计算距离值
double calDistance(Point &a,Point &b)
{
return sqrt((a.xAxle - b.xAxle) * (a.xAxle - b.xAxle) + (a.yAxle - b.yAxle)*(a.yAxle - b.yAxle));
} //计算一个簇里面的均值以获得中心点
void calAverage(vector<Point> num,double &xValueAver,double &yValueAver)
{
int xValue = ,yValue = ;
for(unsigned int i = ;i < num.size();i ++)
{
xValue += num[i].xAxle;
yValue += num[i].yAxle;
} //获得平均值
xValueAver = (double)xValue/num.size();
yValueAver = (double)yValue/num.size(); } //根据簇中心得到集合,getSetValue存储每一个簇里面的元素
void getSet(vector<Point> &numSave,vector<Point> &setCentre,vector<Point> (&getSetValue)[SET_SIZE])
{ for(unsigned int i = ;i < numSave.size();i ++)
{
//设置一个最大值,为了找到最小值
double temp = 100000000.0;
//记录最小的距离numSave[i]的值
unsigned int k = ;
for(unsigned int j = ;j < SET_SIZE;j ++)
{
//计算距离
double dis = calDistance(numSave[i],setCentre[j]);
if(temp > dis)
{
temp = dis;
k = j;//保留最小距离的那个编号
}
}
//将最小值放在相应编号的簇里面
getSetValue[k].push_back(numSave[i]);
}
} void k_average(vector<Point> &numSave,ofstream &os)
{
vector<Point> setCentre;
vector<Point> getSetValue[SET_SIZE];
vector<Point> tempCentre;//用来保存之前的数据,方便对比 //初始时将数据的前几个(定义的簇中心个数)作为中心点
for(unsigned int i = ;i < SET_SIZE && i < numSave.size();i ++)
{
setCentre.push_back(numSave[i]);
} while(true)
{
for(unsigned int i = ;i < SET_SIZE;i ++)
{
getSetValue[i].clear();
}
//根据簇中心找到与簇中心相关的点(距离近的点)
getSet(numSave,setCentre,getSetValue); tempCentre = setCentre;
bool flag = true;
for(unsigned int i = ;i < SET_SIZE;i ++)
{
//输出簇中心点
os << setCentre[i].xAxle << " and " << setCentre[i].yAxle << endl;
/*
for(unsigned int j = 0;j < getSetValue[i].size();j ++)
{
os << getSetValue[i][j].xAxle << " " << getSetValue[i][j].yAxle << "----";
}
os << endl;
*/
//根据新的集合获得新的簇中心
calAverage(getSetValue[i],setCentre[i].xAxle,setCentre[i].yAxle);
} //当其中有一项当前的簇中心相对于之前的移动了较大距离就继续寻找
for(unsigned int i = ;i < SET_SIZE;i ++)
{
if(fabs(setCentre[i].xAxle - tempCentre[i].xAxle) > EXP || fabs(setCentre[i].yAxle - tempCentre[i].yAxle) > EXP )
{
flag = false;
break;
}
} os << endl;
//当每个簇中心不再变化时就不用找了
if(flag)
{
break;
} } } int main()
{
ifstream inFile;
vector<Point> numSave;
readFile(inFile,"input.txt",numSave); ofstream outFile;
outFile.open("output.txt");
if(!outFile)
{
cout << "不能打开文件。请检查文件!" << endl;
}
k_average(numSave,outFile);
return ;
}
代码如下:
K均值算法实现的更多相关文章
- 聚类算法:K-means 算法(k均值算法)
k-means算法: 第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...
- 一句话总结K均值算法
一句话总结K均值算法 核心:把样本分配到离它最近的类中心所属的类,类中心由属于这个类的所有样本确定. k均值算法是一种无监督的聚类算法.算法将每个样本分配到离它最近的那个类中心所代表的类,而类中心的确 ...
- 聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
1.用python实现K均值算法 import numpy as np x = np.random.randint(1,100,20)#产生的20个一到一百的随机整数 y = np.zeros(20) ...
- 【机器学习】K均值算法(I)
K均值算法是一类非监督学习类,其可以通过观察样本的离散性来对样本进行分类. 例如,在对如下图所示的样本中进行聚类,则执行如下步骤 1:随机选取3个点作为聚类中心. 2:簇分配:遍历所有样本然后依据每个 ...
- Bisecting KMeans (二分K均值)算法讲解及实现
算法原理 由于传统的KMeans算法的聚类结果易受到初始聚类中心点选择的影响,因此在传统的KMeans算法的基础上进行算法改进,对初始中心点选取比较严格,各中心点的距离较远,这就避免了初始聚类中心会选 ...
- KMeans (K均值)算法讲解及实现
算法原理 KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标 ...
- 聚类分析K均值算法讲解
聚类分析及K均值算法讲解 吴裕雄 当今信息大爆炸时代,公司企业.教育科学.医疗卫生.社会民生等领域每天都在产生大量的结构多样的数据.产生数据的方式更是多种多样,如各类的:摄像头.传感器.报表.海量网络 ...
- K均值算法
为了便于可视化,样本数据为随机生成的二维样本点. from matplotlib import pyplot as plt import numpy as np import random def k ...
- K均值算法-python实现
测试数据展示: #coding:utf-8__author__ = 'similarface''''实现K均值算法 算法摘要:-----------------------------输入:所有数据点 ...
- spark Bisecting k-means(二分K均值算法)
Bisecting k-means(二分K均值算法) 二分k均值(bisecting k-means)是一种层次聚类方法,算法的主要思想是:首先将所有点作为一个簇,然后将该簇一分为二.之后选择能最大程 ...
随机推荐
- window下部署php_redis扩展
关于redis的一些特性就不多说了,可以到这里去了解,or click me. 另外,给出一个redis中文API,点我. 首先要下载一个redis软件,可以到官网下载. 注意:官网提供的版本比较高级 ...
- 深入分析Volatile的实现原理(转)
引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”.可见性的意思是当 ...
- CF 445A 简单DP
今天早上找一道题的bug,还是找不出来,下午刷了几道水题,晚上准备回家的事, 然后本来想打CF的,一看,数学场,不打了. 这道题的题意: 给出一个序列,每次你可以从这个序列里面选择一个数ak,删除,然 ...
- js复习(二)
一.window.document对象(一)找元素 docunment.getElementById("id"):根据id找,最多找一个: docunment.getElement ...
- 类(class)、构造函数(constructor)、原型(prototype)
类 Class 类的概念应该是面向对象语言的一个特色,但是JavaScript并不像Java,C++等高级语言那样拥有正式的类,而是多数通过构造器以及原型方式来仿造实现.在讨论构造器和原型方法前,我可 ...
- gerrit 使用笔记
添加git hooks git库的钩子目录中有一个commit-msg脚本文件,可以在git执行commit时,在提交信息中自动添加一个唯一的Change-Id scp -P 29419 admin@ ...
- [Flex] PopUpButton系列 —— 将DataGrid作为弹出内容
<?xml version="1.0" encoding="utf-8"?> <!--Flex中如何创建一个可以弹出DataGrid作为菜单的 ...
- SQL Server2008 TIME类型
SQL Server2008现在有了一个TIME数据类型,它允许你只存储一个时间值而没有时间.如果想要存储一个特定的时间信息而不涉及具体的日期时,这将非常的有用.TIME数据类型存储使用24小时制,它 ...
- Mingyang.net:格式化Hibernate的SQL输出语句
在sping与hibernate整合中可以这样的设置 <property name="hibernateProperties"> <props> <p ...
- [HDU 4787] GRE Words Revenge (AC自动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4787 题目大意: 给你若干个单词,查询一篇文章里出现的单词数.. 就是被我水过去的...暴力重建AC自 ...