资源简介
机器学习常见算法中的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客户端服务器源码
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
评论
共有 条评论