FCM模糊均值与改进算法Word格式.docx
- 文档编号:17420150
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:21
- 大小:49.15KB
FCM模糊均值与改进算法Word格式.docx
《FCM模糊均值与改进算法Word格式.docx》由会员分享,可在线阅读,更多相关《FCM模糊均值与改进算法Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
不过,加上归一化规定,一个数据集的隶属度的和总等于1:
(6.9)
那么,FCM的价值函数(或目标函数)就是式(6.2)的一般化形式:
,(6.10)
这里uij介于0,1间;
ci为模糊组I的聚类中心,dij=||ci-xj||为第I个聚类中心与第j个数据点间的欧几里德距离;
且
是一个加权指数。
构造如下新的目标函数,可求得使(6.10)式达到最小值的必要条件:
(6.11)
这里?
j,j=1到n,是(6.9)式的n个约束式的拉格朗日乘子。
对所有输入参量求导,使式(6.10)达到最小的必要条件为:
(6.12)
和
(6.13)
由上述两个必要条件,模糊C均值聚类算法是一个简单的迭代过程。
在批处理方式运行时,FCM用下列步骤确定聚类中心ci和隶属矩阵U[1]:
步骤1:
用值在0,1间的随机数初始化隶属矩阵U,使其满足式(6.9)中的约束条件
步骤2:
用式(6.12)计算c个聚类中心ci,i=1,…,c。
步骤3:
根据式(6.10)计算价值函数。
如果它小于某个确定的阀值,或它相对上次价值函数值的改变量小于某个阀值,则算法停止。
步骤4:
用(6.13)计算新的U矩阵。
返回步骤2。
上述算法也可以先初始化聚类中心,然后再执行迭代过程。
由于不能确保FCM收敛于一个最优解。
算法的性能依赖于初始聚类中心。
因此,我们要么用另外的快速算法确定初始聚类中心,要么每次用不同的初始聚类中心启动该算法,多次运行FCM。
模糊c均值聚类算法如下:
Reapeatforl=123……..
Step1:
computethecluseterprototypes(means):
Step2:
competethedistance:
Step3:
Updatethepartitionmatrix:
算法改进
1)在模糊聚类的目标函数中Bezdek引入了加权指数m,使Dum的聚类准则变成m=2时候的特例,从数学上说m的出现不自然且没有必要,但如果不给以虑属度乘以权值,那么从硬聚类准则函数到软聚类目标函数的推广准则是无效的,参数m又称为平滑因子,控制着模式早模糊类间的分享程度,因此,要实现模糊c聚类就要选择一适合的m,然而最佳的m的选取目前还缺乏理论,监管存在一些经验值或经验范围,但没有面向问题的优选方法,也缺少参数m的有效性评价准则
2)尽管模糊聚类是一种无监督的分类,但现在的聚类算法却=需要应用聚类原型的先验条件,否则算法会产生误导,从未破坏算法的无监督性和自动化。
3)因为模糊聚类目标是非凸的,而模糊C均值聚类算法的计算过程又是迭代爬山,一次很容易陷入局部极值点,从而得不到最优解或满意解,同时,大数据量下算法耗时也是困扰人们的一大难题,这2个问题目前还不能得到全面的解决。
4)FCM类型的聚类算法属于划份方法,对于1组给定的样本集,不管数据中有无聚类结构,也不问分类结果是否有效,总把数据划分到C个子类中,换言之,现有的聚类分析与聚类趋势,以及有效分析是隔离的分离得。
5)FCM的聚类算法是针对特征空间中的点集设计的,对于特殊类型的数据,比如在样本每维特征的赋值不是一个数,而是一个区间。
集合和模糊数时,FCM类型的算法无法直接处理
模糊C均值聚类算法存在上述缺点,改进的算法正确率能达到更高。
Fcm算法在处理小数据集的时候是有效的,但随着数据容量和维数的增加,迭代步骤会显着增加,而且在迭代的每一步都要对整个数据集进行操作,无法满足数据挖掘时的需要。
改进算法的思想是首先采用随机抽样的办法,从数据集中选取多个样本,对每个样本应用FCM算法,将得到的结果作为初始群体,然后再利用遗传算法对聚类结果进行优化,选取其中的最优解做为问题的输出,由于采样技术显着的压缩了问题的规模,而遗传又可以对结果进行全局最优化处理,因此在时间性能和聚类质量上都能获得较满意的结果。
遗传算法是美国Michigon大学的JohnHolland研究机器学习时创立的一种新型的优化算法,它的主要优点是:
遗传算法是从一系列点的群体开始搜索而不是从单个样本点进行搜索,遗传算法利用适应值的相关信息,无需连续可导或其他辅助信息,遗传算法利用转移概率规则,而非确定性规则进行迭代,遗传算法搜索过程中,以对群体进行分化以实现并行运算,遗传算法经过遗传变异和杂交算子的作用,以保证算法以概率1收敛到全局最优解—具有较好的全局特性,其次遗传算法占用计算机的内存小,尤其适用计算复杂的非线性问题。
遗传算法的设计部分
(1)种群中个体的确定
聚类的关键问题是聚类中心的确定,因此可以选取聚类中心作为种群的个体,由于共有C个聚类中心,而每个聚类中心是一个S维的实数向量,因此每个个体的初始值是一个c*s维的市属向量。
(2)编码
常用的编码方式有二进制与实数编码,由于二进制编码的方式搜索能力最强,且交叉变异操作简单高效,因此采用二进制的编码方式,同时防止在进行交叉操作时对优良个体造成较大的破坏,在二进制编码的方式中采用格雷码的编码形式。
每个染色体含c*s个基因链,每个基因链代表一维的数据,由于原始数据中各个属性的取值可能相差很大,因此需首先对数据进行交换以统一基因链的长度,可以有以下两种变换方式。
1扫描整个数据集,确定每维数据的取值范围,然后将其变换到同一量级,在保留一定有效位的基础上取整,根据有效位的个数动态的计算出基因链的长度。
2对数据进行正规化处理,即将各维数据都变换到相同的区间,可以算出此时的基因链长度为10。
(3)适应度函数
由于在算法中只使用了聚类中心V,而未使用虑属矩阵u,因此需要对FCM聚类算法的目标函数进行改进,以适用算法的要求,
和目标函数是等价的,由于遗传算法的适用度一般取值极大,因此可取上式的倒数作为算法的使用度函数。
(4)初始种群的确定
初始种群的一般个体由通过采样后运行FCM算法得到的结果给出,另外的一般个体通过随机指定的方法给出,这样既保证了遗传算法在运算之初就利用背景知识对初始群体的个体进行了优化,使算法能在一个较好的基础上进行,又使得个体不至于过分集中在某一取值空间,保证了种群的多样性。
(5)遗传操作
选择操作采用保持最优的锦标赛法,锦标赛规模为2,即每次随机取2个个体,比较其适应度,较大的作为父个体,并保留每代的最优个体作为下一代,交叉方式一般采用单点交叉或多点交叉法进行,经过试验表明单点交叉效果较好,因此采用单点交叉法,同时在交叉操作中,应该对每维数据分开进行,以保证较大的搜索空间和结果的有效性,变异操作采用基本位变异法。
(6)终止条件的确定
遗传算法在以下二种情况下终止
a最佳个体保持不变的代数达到设定的阈值
b遗传操作以到达给定的最大世代数
算法具体步骤如下
1确定参数,如聚类个数样本集大小种群规模最大世代数交叉概率和变异概率等。
2对数据集进行多次采样并运行FCM算法,得到初始种群的一般个体,通过随机制定产生另一半个体。
3对数据集进行正规化处理并编码。
4计算初始种群中个体的适应度。
5对种群进行遗传操作产生下一代,在操作的过程中,应该排除产生的无效个体。
6计算个体的适应度,如果满足终止条件,则算法结束,否则转到5继续
在理论上讲进行遗传操作的样本容量越大,聚类的误差越小,由于采样技术显着压缩了问题规模,而遗传算法又可以对全局进行最优化处理,因此改进的算法在时间与性能上都能获得较满意的结果,此算法利用采样技术来提高算法的运行速度,利用遗传算法对聚类进行优化,避免陷入局部最优解,在性能上相比于传统的模糊C均值聚类算法获得较大提高。
算法实现
·
采用VC++进行编写
文档的读取
#include"
data.h"
//函数定义
double**DataRead(char*name,introw,intcol)
{
double**p=newdouble*[row];
ifstreaminfile;
infile.open(name,ios:
:
in);
for(inti=0;
i<
row;
i++)
{
p[i]=newdouble[col];
for(intj=0;
j<
col;
j++)
{
infile>
>
p[i][j];
}
}
infile.close();
cout<
<
"
成功读取数据文件:
name<
!
\n"
;
returnp;
//释放内存
for(i=0;
delete[]p[i];
delete[]p;
}
文档的保存
voidDataSave(double**data,introw,intcol,char*name)
inti,j;
ofstreamoutfile;
//打开文件,输出数据
outfile.open(name,ios:
out);
outfile.setf(ios:
fixed);
outfile.precision(4);
for(j=0;
outfile<
data[i][j]<
outfile<
endl;
outfile<
endl<
outfile.close();
数据标准化处理
double**Standardize(double**data,introw,intcol)
double*a=newdouble[col];
//矩阵每列的最大值
double*b=newdouble[col];
//矩阵每列的最小值
double*c=newdouble[row];
//矩阵列元素
//取出数据矩阵的各列元素
c[j]=Data[j][i];
a[i]=c[0],b[i]=c[0];
//取出该列的最大值
if(c[j]>
a[i])
{
a[i]=c[j];
}
//取出该列的最小值
if(c[j]<
b[i])
b[i]=c[j];
}
//数据标准化
data[i][j]=(data[i][j]-b[j])/(a[j]-b[j]);
完成数据极差标准化处理!
delete[]a;
delete[]b;
delete[]c;
returndata;
生成样本虑属矩阵
voidInitialize(double**u,intk,introw)
//初始化样本隶属度矩阵
srand(time(0));
k;
u[i][j]=(double)rand()/RAND_MAX;
//得到一个小于1的小数隶属度
}//rand()函数返回0和RAND_MAX之间的一个伪随机数
数据归一化处理
voidNormalize(double**u,intk,intcol)
double*sum=newdouble[col];
//矩阵U的各列元素之和
for(j=0;
doubledj=0;
for(i=0;
dj=dj+U[i][j];
sum[j]=dj;
//隶属度各列之和
u[i][j]=U[i][j]/sum[j];
}//规一化处理(每列隶属度之和为1)
迭代过程
func.h"
//对模糊C均值进行迭代运算,并返回有效性评价函数的值
doubleUpdate(double**u,double**data,double**center,introw,intcol,intk)
inti,j,t;
double**p=NULL;
//模糊指数取2
u[i][j]=pow(u[i][j],2);
//根据隶属度矩阵计算聚类中心
p=MatrixMul(u,k,row,data,row,col);
//计算隶属度矩阵每行之和
doublesi=0;
si+=u[i][j];
for(t=0;
t<
t++)
{
center[i][t]=p[i][t]/si;
//类中心
//计算各个聚类中心i分别到所有点j的距离矩阵dis(i,j)
//第一个样本点
//第二个样本点
double**dis=newdouble*[k];
//中心与样本之间距离矩阵
dis[i]=newdouble[row];
//聚类中心
a[t]=center[i][t];
//暂存类中心
//数据样本
for(t=0;
b[t]=data[j][t];
//暂存一样本
doubled=0;
//中心与样本之间距离的计算
d+=(a[t]-b[t])*(a[t]-b[t]);
//d为一中心与所有样本的距离的平方和
}
dis[i][j]=sqrt(d);
//距离
//根据距离矩阵计算隶属度矩阵
{
doubletemp=0;
{
//dis[i][j]依次除以所在列的各元素,加和;
//模糊指数为2.0
temp+=pow(dis[i][j]/dis[t][j],2/(2.0-1));
//一个类中心和一个元素的距离平方与
u[i][j]=1/temp;
//所有类与该元素距离平方的和的商
//计算聚类有效性评价函数
doublefunc1=0;
doublefunc2=0;
func2+=pow(u[i][j],2.0)*pow(dis[i][j],2);
func1+=func2;
doubleobj_fcn=1/(1+func1);
returnobj_fcn;
//内存释放
delete[]dis[i];
delete[]dis;
详细过程
max.h"
//全局变量定义
double**Data;
//数据矩阵
double**Center;
//聚类中心矩阵
double**U;
//样本隶属度矩阵
intm;
//样本总数
intn;
//样本属性数
intk;
//设定的划分类别数
intmain()
intLab;
//数据文件标号
intnum;
//算法运行次数
///////////////////////////////////////////////////////////////
模糊C均值聚类算法:
1-iris.txt;
2-wine.txt;
3-ASD_12_2.txt;
4-ASD_14_2.txt"
请选择数据集:
Lab="
cin>
Lab;
设定运行次数:
mum="
num;
//各次运行结束后的目标函数
double*Index=newdouble[num];
//各次运行结束后的聚类正确率
double*R=newdouble[num];
//num次运行的平均目标函数及平均正确率
doubleM_Index=0;
doubleM_R=0;
//FCM聚类算法运行num次,并保存记录与结果
intj;
doubleepsilon=1e-4;
inte=0;
intnx=0;
//记录连续无改进次数
intE[200]={0};
if(i>
0)
cout<
setfill('
#'
)<
setw(10)<
cout<
第"
i+1<
次运行记录:
//读取数据文件
if(Lab==1)
m=150;
n=4;
k=3;
Data=DataRead("
dataset\\iris.txt"
m,n);
elseif(Lab==2)
m=178;
n=13;
dataset\\wine.txt"
elseif(Lab==3)
m=535;
n=2;
k=12;
dataset\\ASD_12_2.txt"
elseif(Lab==4)
m=685;
k=14;
dataset\\ASD_14_2.txt"
//数据极差标准化处理
Data=Standardize(Data,m,n);
//聚类中心及隶属度矩阵,内存分配
Center=newdouble*[k];
U=newdouble*[k];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FCM 模糊 均值 改进 算法
![提示](https://static.bdocx.com/images/bang_tan.gif)