生成聚类中心:最大最小距离算法
2017-06-24 09:20
916 查看
样本:x0(0 0), x1(3 8), x2(2 2), x3(1 1), x4(5 3), x5(4 8), x6(6 3), x7(5 4), x8(6 4), x9(7 5)
![](http://img.blog.csdn.net/20170626083944261)
一个粗糙的最大最小距离算法代码#include <bits/stdc++.h>
using namespace std;
const double INF=9999999999999;
const int MAXN=1e6+10;
double D;//Distance limit between different Cluster Centers
int sum;//The number of Pattern
bool isCenter[MAXN];//save Cluster Centers
typedef struct Pattern{
double x,y;
int id;
}Pattern;
Pattern node[MAXN];
typedef struct Clusters{
vector <Pattern> Cluster_Center;
vector <int> Cluster[MAXN];
public:
bool empty(){
return Cluster_Center.empty()?1:0;
}
void push(Pattern x){
Cluster_Center.push_back(x);
return ;
}
double dis(Pattern x){
double mindis=INF,tempdis;
int len=Cluster_Center.size();
for(int i=0;i<len;i++){
tempdis=sqrt((x.x-Cluster_Center[i].x)*(x.x-Cluster_Center[i].x)+(x.y-Cluster_Center[i].y)*(x.y-Cluster_Center[i].y));
mindis=min(mindis,tempdis);
}
return mindis;
}
void showCenter(){
int len=Cluster_Center.size();
cout<<"计算聚类中心完毕,展示所有聚类中心:"<<endl;
for(int i=0;i<len;i++){
cout<<'x'<<Cluster_Center[i].id<<' '<<Cluster_Center[i].x<<' '<<Cluster_Center[i].y<<endl;
}
}
void order(Pattern a[]){
int len=Cluster_Center.size();
for(int i=0;i<len;i++){
Cluster[i].push_back(Cluster_Center[i].id);
}
for(int i=0;i<sum;i++){
if(!isCenter[i]){
double tempdis,minndis=INF;
int belong=-1;
for(int j=0;j<len;j++){
tempdis=sqrt((a[i].x-Cluster_Center[j].x)*(a[i].x-Cluster_Center[j].x)+(a[i].y-Cluster_Center[j].y)*(a[i].y-Cluster_Center[j].y));
if(tempdis<minndis){
minndis=tempdis;
belong=j;
}
}
Cluster[belong].push_back(i);
}
}
}
void showCluster(){
int len=Cluster_Center.size();
cout<<"计算聚类,展示所有聚类:"<<endl;
for(int i=0;i<len;i++){
int llen=Cluster[i].size();
cout<<"第"<<i<<"类样本集为:"<<endl;
for(int j=0;j<llen;j++){
cout<<'x'<<Cluster[i][j]<<' ';
}
cout<<endl;
}
}
}Clusters;
Clusters clu;
void ini(){
memset(isCenter,0,sizeof(isCenter));
node[0]={0,0,0};node[1]={3,8,1};node[2]={2,2,2};node[3]={1,1,3};node[4]={4,2,4};node[5]={4,8,5};node[6]={6,3,6};node[7]={5,4,7};node[8]={6,4,8};node[9]={7,5,9};
D=3;
sum=10;
clu.Cluster_Center.clear();
}
bool Find_Cluster_Center(){
if(clu.empty()){
isCenter[0]=1;
clu.push(node[0]);
}else{
double tempdis;
double maxndis=-INF;
int newCenter=-1;
for(int i=0;i<sum;i++){
if(!isCenter[i]){
tempdis=clu.dis(node[i]);
if(tempdis>maxndis){
newCenter=i;
maxndis=tempdis;
}
}
}
if(maxndis<D) return 0;
isCenter[newCenter]=1;
clu.push(node[newCenter]);
}
return 1;
}
int main()
{
ini();
while(1){
if(!Find_Cluster_Center()) break;
}
clu.showCenter();
clu.order(node);
clu.showCluster();
}
一个粗糙的最大最小距离算法代码#include <bits/stdc++.h>
using namespace std;
const double INF=9999999999999;
const int MAXN=1e6+10;
double D;//Distance limit between different Cluster Centers
int sum;//The number of Pattern
bool isCenter[MAXN];//save Cluster Centers
typedef struct Pattern{
double x,y;
int id;
}Pattern;
Pattern node[MAXN];
typedef struct Clusters{
vector <Pattern> Cluster_Center;
vector <int> Cluster[MAXN];
public:
bool empty(){
return Cluster_Center.empty()?1:0;
}
void push(Pattern x){
Cluster_Center.push_back(x);
return ;
}
double dis(Pattern x){
double mindis=INF,tempdis;
int len=Cluster_Center.size();
for(int i=0;i<len;i++){
tempdis=sqrt((x.x-Cluster_Center[i].x)*(x.x-Cluster_Center[i].x)+(x.y-Cluster_Center[i].y)*(x.y-Cluster_Center[i].y));
mindis=min(mindis,tempdis);
}
return mindis;
}
void showCenter(){
int len=Cluster_Center.size();
cout<<"计算聚类中心完毕,展示所有聚类中心:"<<endl;
for(int i=0;i<len;i++){
cout<<'x'<<Cluster_Center[i].id<<' '<<Cluster_Center[i].x<<' '<<Cluster_Center[i].y<<endl;
}
}
void order(Pattern a[]){
int len=Cluster_Center.size();
for(int i=0;i<len;i++){
Cluster[i].push_back(Cluster_Center[i].id);
}
for(int i=0;i<sum;i++){
if(!isCenter[i]){
double tempdis,minndis=INF;
int belong=-1;
for(int j=0;j<len;j++){
tempdis=sqrt((a[i].x-Cluster_Center[j].x)*(a[i].x-Cluster_Center[j].x)+(a[i].y-Cluster_Center[j].y)*(a[i].y-Cluster_Center[j].y));
if(tempdis<minndis){
minndis=tempdis;
belong=j;
}
}
Cluster[belong].push_back(i);
}
}
}
void showCluster(){
int len=Cluster_Center.size();
cout<<"计算聚类,展示所有聚类:"<<endl;
for(int i=0;i<len;i++){
int llen=Cluster[i].size();
cout<<"第"<<i<<"类样本集为:"<<endl;
for(int j=0;j<llen;j++){
cout<<'x'<<Cluster[i][j]<<' ';
}
cout<<endl;
}
}
}Clusters;
Clusters clu;
void ini(){
memset(isCenter,0,sizeof(isCenter));
node[0]={0,0,0};node[1]={3,8,1};node[2]={2,2,2};node[3]={1,1,3};node[4]={4,2,4};node[5]={4,8,5};node[6]={6,3,6};node[7]={5,4,7};node[8]={6,4,8};node[9]={7,5,9};
D=3;
sum=10;
clu.Cluster_Center.clear();
}
bool Find_Cluster_Center(){
if(clu.empty()){
isCenter[0]=1;
clu.push(node[0]);
}else{
double tempdis;
double maxndis=-INF;
int newCenter=-1;
for(int i=0;i<sum;i++){
if(!isCenter[i]){
tempdis=clu.dis(node[i]);
if(tempdis>maxndis){
newCenter=i;
maxndis=tempdis;
}
}
}
if(maxndis<D) return 0;
isCenter[newCenter]=1;
clu.push(node[newCenter]);
}
return 1;
}
int main()
{
ini();
while(1){
if(!Find_Cluster_Center()) break;
}
clu.showCenter();
clu.order(node);
clu.showCluster();
}
相关文章推荐
- 最大边与最小边差最小的最小生成树——pku3522
- POJ2485 求最小生成树的最大边长度
- 求图的绝对中心 && 最小直径生成树 MDST
- POJ3723 Conscription , 最大权森林问题 ->最小生成树问题
- 最小生成树的最大边poj2395
- 将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(对比两个程序)
- (hruscal12.3.3)POJ 3522 Slim Span(求解一个生成树使得该树中的最大边权值和最小边权值之差最小)
- poj 2377-prim(最小生成树的最大边权的和)
- 将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素
- 输入数列,以某数为结束标志,以“先进先出”方式生成单链表,输出表中各结点的值;再求表中结点的平均值、最大值、最小值。
- POJ2485 求最小生成树的最大边长度
- poj 2395 Out of Hay (最小生成树的最大边)
- poj 2395 Out of Hay (最小生成树的最大边)
- 求图的绝对中心 && 最小直径生成树 MDST
- 将一个5*5的矩阵中最大的元素放在中心,4个角分别放在4个最小的元素
- poj 2485 Highways prim最小生成树 基础 球最小生成树中得最大边
- UESTC 1635 最大最小生成树
- poj 2485 Highways 求最小生成树中的最大边
- POJ 2485 Highways【最小生成树最大权——简单模板】
- (kruscal12.3.1)POJ 1861 Network(求最小生成树的最大边&&并且输出各边的信息)