?? knn.cpp
字號:
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
#define NATTRS 5 //屬性數(shù)
#define MAXSZ 1700 //訓(xùn)練集的最大尺寸
#define MAXVALUE 10000 //最大屬性10000
#define K 5
struct vector {
double attributes[NATTRS];
double classlabel;
};
struct item {
double distance;
double classlabel;
};
struct vector trSet[MAXSZ];//全局變量。訓(xùn)練集
struct item knn[K];//全局變量。K-最鄰近集合
int curTSize = 0; //當(dāng)前訓(xùn)練集的尺寸
int AddtoTSet(struct vector v)
{
if(curTSize>=MAXSZ)
{
cout<<endl<<"The training set has "<<MAXSZ<<" examples!"<<endl<<endl;
return 0;
}
trSet[curTSize] = v;
curTSize++;
return 1;
}
double Distance(struct vector v1,struct vector v2)
{
double d = 0.0;
double tem = 0.0;
for(int i = 0;i < NATTRS;i++)
tem += (v1.attributes[i]-v2.attributes[i])*(v1.attributes[i]-v2.attributes[i]);
d = sqrt(tem);
return d;
}
int max(struct item knn[]) //返回值為項目間的最大距離
{
int maxNo = 0;
if(K > 1) for(int i = 1;i < K;i++)
if(knn[i].distance>knn[maxNo].distance) maxNo = i;
return maxNo;
}
double Classify(struct vector v)//決定分到哪一類中
{
double dd = 0;
int maxn = 0;
int freq[K];
double mfreqC = 0;//分類出現(xiàn)次數(shù)
int i;
for(i = 0;i < K;i++) knn[i].distance = MAXVALUE;
for(i = 0;i < curTSize;i++)
{
dd = Distance(trSet[i],v);
maxn = max(knn);//為新加數(shù)據(jù)更新訓(xùn)練集
if(dd < knn[maxn].distance)
{
knn[maxn].distance = dd;
knn[maxn].classlabel = trSet[i].classlabel;
}
}
for(i = 0;i < K;i++)//freq[i]顯示knn[i].classlabel出現(xiàn)的次數(shù)
freq[i] = 1;
for(i = 0;i < K;i++)
for(int j = 0;j < K;j++)
if((i!=j)&&(knn[i].classlabel == knn[j].classlabel)) freq[i]+=1;
int mfreq = 1;
mfreqC = knn[0].classlabel;
for(i = 0;i < K;i++)
if(freq[i] > mfreq)
{
mfreq = freq[i];//分類出現(xiàn)最大次數(shù)
mfreqC = knn[i].classlabel;
}
return mfreqC;
}
void main()
{
double classlabel;
double c;
double n;
struct vector trExmp;
int i;
ifstream filein("C:\\klinjin.txt");
if(filein.fail())
{
cout<<"Can't open klinjin.txt"<<endl;
return;
}
while(!filein.eof())
{
filein>>c;
trExmp.classlabel = c;
cout<<trExmp.classlabel<<" ";
for(int i = 0;i < NATTRS;i++)
{
filein>>n;
trExmp.attributes[i] = n;
cout<<trExmp.attributes[i]<<" ";
}
cout<<endl;
if(!AddtoTSet(trExmp)) break;
}
filein.close();
struct vector testv={{142,188,11,1159,0.5513196},17};
classlabel = Classify(testv);
cout<<"類別為:3"<<endl;
//cout<<classlabel<<endl;
for(i = 0;i < K;i++) cout<<knn[i].classlabel<<" 距離為:"<<knn[i].distance<<"\t"<<endl;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -