📄 medoids.cpp
字号:
#include<fstream>
#include<cmath>
#include"medoids.h"
using namespace std;
void medoids::initial(string fileName,int k)
{
getData(fileName);
if(data.size()<k)
clusterNum = data.size();
else
clusterNum = k;
for(int i=0;i<clusterNum;i++)
center.push_back(data[i]);
cluster.resize(clusterNum);
int s = cluster.size();
}
void medoids::getData(string file)
{
ifstream in(file.c_str(),ios::in);
if(!in.is_open())
{
cout<<"open file failed!";
exit(1);
}
int size;
in>>size;
for(int i=0;i<size;i++)
{
double temp;
in>>temp;
data.push_back(temp);
}
in.close();
}
void medoids::distribute()
{
cluster.clear();
cluster.resize(clusterNum);
int s = cluster.size();
for(int i=0;i<data.size();i++)
{
int pos = closet(data[i]);
cluster[pos].insert(data[i]);
}
}
int medoids::closet(int num)
{
int pos = -1;
double min = 9.9e+20;
for(int i=0;i<center.size();i++)
if(min>fabs(center[i]-num))
{
min = fabs(center[i]-num);
pos = i;
}
return pos;
}
bool medoids::findNewCenter()
{
bool again = false;
for(int i=0;i<cluster.size();i++)
{
double newCenter = calCost(cluster[i]);
if(newCenter!=center[i])
{
center[i]=newCenter;
again = true;
}
}
return again;
}
double medoids::calCost(set<double>& s)
{
set<double>::iterator ite = s.begin();
int minCost = 9.9e+20;
double newCenter = -1;
while(ite!=s.end())
{
set<double>::iterator ite1 = s.begin();
double total=0;
while(ite1!=s.end())
{
double delta = (*ite1)-(*ite);
total = total + delta*delta;
ite1++;
}
if(total<minCost)
{
minCost = total;
newCenter = (*ite);
}
ite++;
}
return newCenter;
}
void medoids::print()
{
ofstream cout("medoids.txt",ios::out);
set<double>::iterator ite;
for(int i=0;i<clusterNum;i++)
{
cout<<"cluster "<<i<<endl;
cout<<"medoids "<<center[i]<<endl;
ite = cluster[i].begin();
while(ite!=cluster[i].end())
{
cout<<(*ite)<< ' ';
ite++;
}
cout<<endl<<endl<<endl;
}
//cout.close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -