
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std
int N //数据个数
int K //集合个数
int *CenterIndex//质心索引集合,即属于第几个参考点
double *Center //质心集合
double *CenterCopy
double *DataSet
double **Cluster
int *Top
/*算法描述:
C-Fuzzy均值聚类算法采用的是给定类的个数K,将N个元素(对象)分配到K个类中去使得类内对象之间的相似性最大,而类之间的相似性最小 */
//函数声明部分
void InitData()
void InitCenter()
void CreateRandomArray(int n,int k,int *centerIndex)
void CopyCenter()
void UpdateCluster()
void UpdateCenter()
int GetIndex(double value,double *centerIndex)
void AddtoCluster(int index,double value)
void print()
bool IsEqual(double *center,double *centercopy)
int main()
{
int Flag=1
InitData()
while(Flag)//无限次循环
{
UpdateCluster()
UpdateCenter()
if(IsEqual(Center,CenterCopy))
{
Flag=0
}
else
{
CopyCenter()
}
}
print()
getchar()
system("pause")
}
void InitData()
{
int i=0
int a
cout<<"请输入数据元素的个数: "
cin>>N
cout<<"请输入分类数: "
cin>>K
if(K>N)
{
return
}
CenterIndex =new int [sizeof(int)]
Center =new double [sizeof(double)*K]
CenterCopy =new double [sizeof(double)*K]
DataSet =new double [sizeof(double)*N]
Cluster =new double* [sizeof(double*)*K]
Top =new int [sizeof(int)*K]
//初始化K个类的集合
for(i=0i<Ki++)
{
Cluster[i]=new double [sizeof(double)*N]
Top[i]=0
}
cout<<"请输入数据"<<endl
for(i=0i<Ni++)
{
cin>>a
DataSet[i]=a
}
//初始化质心集合
InitCenter()
UpdateCluster()
}
void InitCenter()//初始化中心点(参照点)
{
int i=0
//产生随即的K个<N的不同的序列
CreateRandomArray(N,K,CenterIndex)
for(i=0i<Ki++)
{
Center[i]=DataSet[CenterIndex[i]]
}
CopyCenter()
}
void CreateRandomArray(int n,int k,int *centerIndex)//产生可以随输出控制的 k与n (可舍弃)
{
int i=0,j=0
for(i=0i<Ki++)
{
int a=rand()%n
for(j=0j<ij++)
{
if(centerIndex[j]==a)
break
}
if(j>=i)
{
centerIndex[i]=a
}
else
{
i--
}
}
}
void CopyCenter()//将旧的中心点保留以作比较
{
int i=0
for(i=0i<Ki++)
{
CenterCopy[i]=Center[i]
}
}
void UpdateCluster()//
{
int i=0
int tindex
for(i<Ki++)
{
Top[i]=0
}
for(i=0i<Ni++)
{
tindex=GetIndex(DataSet[i],Center)
AddtoCluster(tindex,DataSet[i])
}
}
int GetIndex(double value,double *center)//判断属于哪个参照点
{
int i=0
int index=i
double min=fabs(value-center[i])
for(i=0i<Ki++)
{
if(fabs(value-center[i])<min)
{
index=i
min=fabs(value-center[i])
}
}
return index
}
void AddtoCluster(int index,double value)//统计每组个数(用于均值法求新的参照点)
{
Cluster[index][Top[index]]=value
Top[index]++
}
void UpdateCenter()//更新参照点
{
int i=0,j=0
double sum
for(i=0i<Ki++)
{
sum=0.0
for(j=0j<Top[i]j++)
{
sum+=Cluster[i][j]
}
if(Top[i]>0)
{
Center[i]=sum/Top[i]
}
}
}
bool IsEqual(double *center,double*centercopy)//
{
int i
for(i=0i<Ki++)
{
if(fabs(center[i]!=centercopy[i]))
return 0
}
return 1
}
void print()//
{
int i,j
cout<<"===================================="<<endl
for(i=0i<Ki++)
{
cout<<"第"<<i<<"组:质心为:"<<Center[i]<<endl
cout<<"数据元素为:\n"
for(j=0j<Top[i]j++)
{
cout<<Cluster[i][j]<<'\t'
}
cout<<endl
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)