📄 knearest.cpp
字号:
#include <map>
#include "knearest.h"
void Knn::run()
{
this->init();
this->calDist();
this->saveKPatterns();
this->calCluster();
}
void Knn::init()
{
this->patterns.load(KNN);
this->sample = this->patterns.getPattern(0);
cout<<"enter k: ";
cin>>this->k;
}
void Knn::calDist()
{
double dist = 0;
for(int i = 1; i < this->patterns.numOfPatterns; i++)
{
dist = this->patterns.caluDistance(this->sample, this->patterns.getPattern(i));
this->distMap.insert(map<double, int>::value_type(dist, i));
}
}
void Knn::saveKPatterns()
{
char ifsave;
cout<<"the sample has been classfied...."<<endl;
cout<<"save the clusters?[y/n]: ";
cin>>ifsave;
if(ifsave=='y' || ifsave=='Y')
{
cout<<"input the target file name: ";
string fileName;
cin>>fileName;
ofstream fout;
fout.open(fileName.c_str(), ios::out);
map<double,int>::iterator iter = this->distMap.begin();
for( int i = 0; i < k; iter++,i++)
{
Pattern pattern = this->patterns.getPattern(iter->second);
for(int j = 0; j < this->patterns.numOfDim; j++)
{
fout<<pattern[j]<<" ";
}
fout<<endl;
}
fout.close();
}
}
int Knn::calCluster()
{
map<int,int> countMap;
map<int,int>::iterator iter2 = countMap.begin();
map<double,int>::iterator iter = this->distMap.begin();
for(int i = 0; iter != this->distMap.end() && i < k; iter++,i++)
{
Pattern pattern = this->patterns.getPattern(iter->second);
int clusterId = pattern[this->patterns.numOfDim];
if((iter2=countMap.find(clusterId)) == countMap.end())
{
countMap.insert(map<int,int>::value_type(clusterId,1));
}
else
{
iter2->second++;
}
}
map<int,int>::iterator maxIter = countMap.begin();
for(iter2 = countMap.begin(); iter2!=countMap.end(); iter2++)
{
if(iter2->second > maxIter->second)
{
maxIter = iter2;
}
}
cout<<"the sample belongs to cluster "<<maxIter->first<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -