资源简介
机器学习常见算法中的k-means算法,基于距离进行分类,用VS实现。
代码片段和文件信息
#include “StdAfx.h“
#include //输入输出流
#include //字符串流
#include //文件流
#include //向量
#include
#include
#include
#define k 5//簇的数目
using namespace std;
//存放元组的属性信息
typedef vector Tuple;//存储每条数据记录
int dataNum;//数据集中数据记录数目
int dimNum;//每条记录的维数
//计算两个元组间的欧几里得距离
double getDistXY(const Tuple& t1 const Tuple& t2)
{
double sum = 0;
for(int i=1; i<=dimNum; ++i)
{
sum += (t1[i]-t2[i]) * (t1[i]-t2[i]);
}
return sqrt(sum);
}
//根据质心,决定当前元组属于哪个簇
int clusterOfTuple(Tuple means[]const Tuple& tuple){
double dist=getDistXY(means[0]tuple); //元组与第0簇的距离
double tmp;
int label=0;//标示属于哪一个簇
for(int i=1;i tmp=getDistXY(means[i]tuple); //元组与第1簇的距离
if(tmp }
return label;
}
//获得给定簇集的平方误差
double getVar(vector clusters[]Tuple means[]){ //给定簇,给定质心
double var = 0;
for (int i = 0; i < k; i++)
{
vector t = clusters[i];
for (int j = 0; j< t.size(); j++)
{
var += getDistXY(t[j]means[i]); //实现了误差的公式
}
}
//cout<<“sum:“< return var;
}
//获得当前簇的均值(质心)
Tuple getMeans(const vector& cluster){
int num = cluster.size();
Tuple t(dimNum+1 0);
for (int i = 0; i < num; i++)
{
for(int j=1; j<=dimNum; ++j)
{
t[j] += cluster[i][j]; //先把簇中第一个样本点4个维度值全部加上
}
}
for(int j=1; j<=dimNum; ++j)
t[j] /= num;
return t;
//cout<<“sum:“< }
void print(const vector clusters[]) //输出各个簇的样本
{
for(int lable=0; lable {
cout<<“第“< vector t = clusters[lable];
for(int i=0; i {
cout< for(int j=0; j<=dimNum; ++j)
{
cout< }
cout<<“)\n“;
}
}
}
void KMeans(vector& tuples){
vector clusters[k];//k个簇
Tuple means[k];//k个中心点
int i=0;
//一开始随机选取k条记录的值作为k个簇的质心(均值)
srand((unsigned int)time(NULL));
for(i=0;i int iToSelect = rand()%tuples.size(); //实现了0~150之间随机取数
if(means[iToSelect].size() == 0)
{
for(int j=0; j<=dimNum; ++j)
{
means[i].push_back(tuples[iToSelect][j]);
}
++i;
}
}
int lable=0;
//根据默认的质心给簇赋值
for(i=0;i!=tuples.size();++i){
lable=clusterOfTuple(meanstuples[i]);
clusters[lable].push_back(tuples[i]);
}
double oldVar=-1;
double newVar=getVar(clustersmeans);
cout<<“初始的的整体误差平方和为:“< int t = 0;
while(abs(newVar - oldVar) >= 1) //当新旧函数值相差不到1即准则函数值不发生明显变化时,算法终止
{
cout<<“第 “<<++t<<“ 次迭代开始:“< for (i = 0; i < k; i++) //更新每个簇的中心点
{
means[i] = getMeans(clusters[i]);
}
oldVar = newVar;
newVar = getVar(clustersmeans); //计算新的准则函数值
for (i = 0; i < k; i++) //清空每个簇,因为要重新聚类
{
clusters[i].clear();
}
//根据新的质心获得新的簇
for(i=0; i!=tuples.size(); ++i){
lable=clusterOfTuple(meanstuples[i]);
clusters[lable].push_back(tupl
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-12-14 20:38 k-means\
目录 0 2017-09-30 18:51 k-means\Debug\
文件 1502208 2016-04-24 09:48 k-means\Debug\k-means.pdb
目录 0 2017-12-14 20:38 k-means\ipch\
目录 0 2017-12-14 20:38 k-means\ipch\k-means-ac73d6f9\
文件 2359296 2017-12-14 20:38 k-means\ipch\k-means-ac73d6f9\k-means-c0adf4d8.ipch
目录 0 2017-09-30 18:51 k-means\k-means\
目录 0 2017-09-30 18:51 k-means\k-means\Debug\
文件 21546 2017-07-30 14:14 k-means\k-means\Debug\CL.read.1.tlog
文件 1870 2017-07-30 14:14 k-means\k-means\Debug\CL.write.1.tlog
文件 3074 2017-07-30 14:14 k-means\k-means\Debug\cl.command.1.tlog
文件 406 2016-04-23 14:31 k-means\k-means\Debug\k-means.exe.em
文件 472 2017-07-30 14:14 k-means\k-means\Debug\k-means.exe.em
文件 381 2016-04-24 09:48 k-means\k-means\Debug\k-means.exe.intermediate.manifest
文件 66 2017-07-30 14:14 k-means\k-means\Debug\k-means.lastbuildstate
文件 1936 2017-07-30 14:37 k-means\k-means\Debug\k-means.log
文件 567632 2017-07-30 14:14 k-means\k-means\Debug\k-means.obj
文件 1179648 2017-07-30 14:14 k-means\k-means\Debug\k-means.pch
文件 0 2017-07-30 14:14 k-means\k-means\Debug\k-means.unsuccessfulbuild
文件 713 2017-07-30 14:14 k-means\k-means\Debug\k-means.vcxprojResolveAssemblyReference.cache
文件 0 2017-07-30 14:14 k-means\k-means\Debug\k-means.write.1.tlog
文件 204 2016-04-23 14:31 k-means\k-means\Debug\k-means_manifest.rc
文件 2 2017-07-30 14:14 k-means\k-means\Debug\li
文件 2 2017-07-30 14:14 k-means\k-means\Debug\li
文件 2 2017-07-30 14:14 k-means\k-means\Debug\li
文件 2 2017-07-30 14:14 k-means\k-means\Debug\li
文件 2 2017-07-30 14:14 k-means\k-means\Debug\li
文件 2 2017-07-30 14:14 k-means\k-means\Debug\li
文件 2 2017-07-30 14:14 k-means\k-means\Debug\li
文件 2 2017-07-30 14:14 k-means\k-means\Debug\li
文件 2 2017-07-30 14:14 k-means\k-means\Debug\li
............此处省略27个文件信息
- 上一篇:进程管理模拟 VC++ mfc实现
- 下一篇:OpenSSL客户端服务器源码
相关资源
- 进程管理模拟 VC++ mfc实现
- 销售管理系统C++
- 列车时刻表查询系统c++ sql
- Visual_C++_开发的即时通讯系统
- 82道华为校招历年机试编程题C++代码附
- 画图模仿画图白板小程序源代码(V
- 经典小游戏大集合(C++ 源码)
- AES加密/解密C++源代码
- 分别用c语言和c++mfc实现正态分布曲线
- Programming_With_Microsoft_Visual_C++_.Net
- 语音识别端点检测程序C++
- visual c++实现的跳棋程序
- ISO/IEC 14882:2014 C++14 C++标准 英文版 P
- 用C++实现MapInfo 的mif文件读取源码
- 七巧板VC++实现
- 深入理解C++11:C++11新特性解析与应用
- C++FTP服务端客户端
- C11 C++11标准帮助文档中文版-20181230
- 一个用C++编写的画图程序
- Snake主动轮廓模型的C++实现
- C++调用python3.5中的函数
- visual c++数字图像处理何斌光盘源代码
- 用C++实现OFDM
- C++游戏开发指南C++ Game Development Cook
- OpenCV多通道图像混合程序 by浅墨
- Code_Note_2
- 用于图像边缘提取的prewitt算子的C++代
- C++并发编程实战(中文版)
- 随机点名(mfc实现)+源码
- 使用TCP简单文件传输控制台程序VC++
评论
共有 条评论