⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 medoids.cpp

📁 一个完整的以类的形式的k-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 + -