同K均值类似,FCM算法也是一个基于划分聚类算法,它思想就是使得被划分到同一簇对象之间相同度最大,而不一样簇之间相同度最小。 模糊C均值是一般C均值聚类算法改善,一般C均值对数据进行硬性划分,一个样本一定明确属于某一类,FCM对数据进行模糊划分,使用隶属度表示一个样本属于某一类程度。实际聚类中可能会碰到这么情况,蝴蝶形数据集中样本点类别不好硬性判定,所以引入隶属度来进行模糊划分。 隶属度函数是表示一个对象x隶属于集合A程度函数,通常记做μA(x),其自变量范围是全部可能属于集合A对象(即集合A所在空间中全部点),取值范围是[0,1],即0<=1,μA(x)<=1。μA(x)=1表示x完全隶属于集合A,相当于传统集合概念上x∈A。一个定义在空间X={x}上隶属度函数就定义了一个模糊集合A,或叫定义在论域X={x}上模糊子集。对于有限个对象x1,x2,……,xn模糊集合能够表示为::Uc×n Uij是第i个样本属于第j个聚类隶属度。(a)确定类别数C,参数m,和迭代停止误差Epslion和最大迭代次数MaxIterationTimes(b)初始化聚类中心P(c)计算初始距离矩阵D(d)按下列公式更新隶属度:注意,假如有距离为0情况出现,则把该点和对应类隶属度设为1,其它设为0。(e)更新聚类中心(f)重新计算距离矩阵,并计算目标函数值(g)若达成最大迭代次数或前后两次J绝对差小于迭代停止误差则停止,不然转(d),也能够使用前后两次隶属度矩阵差来判定。(h)将样本点划分为隶属度最大那一类。(使用了opencv做数据显示)[cpp] viewplaincopy#include "" #include <> #include <> #include "" //FCM聚类,得到结果从0开始计数 void myFCMeans(float* pSamples,int* pClusterResult,int clusterNum,int sampleNum,int featureNum,int m_Value); void main() { #define MAX_CLUSTERS 5 CvScalar color_tab[MAX_CLUSTERS]; IplImage* img = cvCreateImage( cvSize( 500, 500 ), IPL_DEPTH_8U, 3 ); CvRNG rng = cvRNG(cvGetTickCount()); CvPoint ipt; color_tab[0] = CV_RGB(255,0,0); color_tab[1] = CV_RGB(0,255,0); color_tab[2] = CV_RGB(100,100,255); color_tab[3] = CV_RGB(255,0,255); color_tab[4] = CV_RGB(255,255,0); int i,k; int clusterNum = cvRandInt(&rng)%MAX_CLUSTERS + 2; //最少有两类 int sampleNum = cvRandInt(&rng)%1000 + 100; //最少100个点 int feaNum=2; CvMat* sampleMat = cvCreateMat( sampleNum, 1, CV_32FC2 ); /* generate random sample from multigaussian distribution */ //产生高斯随机数 for( k = 0; k < clusterNum; k++ ) { CvPoint center; int topIndex=k*sampleNum/clusterNum; int bottomIndex=(k == clusterNum - 1 ? sampleNum : (k+1)*sampleNum/clusterNum); CvMat* localMat=cvCreateMatHeader(bottomIndex-topIndex,1,CV_32FC2); = cvRandInt(&rng)%img->width;
C聚类样本 来自淘豆网m.daumloan.com转载请标明出处.