資源簡介
機器學習常見算法中的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? {
vector?t?=?clusters[i];
for?(int?j?=?0;?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? {
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? {
means[i]?=?getMeans(clusters[i]);
}
oldVar?=?newVar;
newVar?=?getVar(clustersmeans);?//計算新的準則函數值
for?(i?=?0;?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客戶端服務器源碼
評論
共有 條評論