模糊聚类划分matlab代码,Matlab协同模糊聚类建模
%本程序實現了把協同模糊聚類算法和G-K算法相結合,構建T-S模型
%并用該模型對數據進行測試
%輸入數據:
%ytrain:訓練數據的實際輸出,是一個列向量
%xtrain:訓練數據矩陣,分為兩組,每組的每行代表一個特征.每組特征不同
%ytest:測試數據的實際輸出,是一組列向量
%xtest:測試數據矩陣,其每行代表一個特征,并且與訓練數據矩陣中的第一組相同
%輸出數據:
%trainRMSE:模型對訓練數據的均方根誤差
%testRMSE:模型對測試數據的均方根誤差
%最后輸出模型對測試數據的擬合圖
%說明:
%由于交叉驗證的原因,對不用的測試數據分組不同,所以n也有不同
clear all
fid=fopen('MPG.txt','r');
original=fscanf(fid,'%f',[8,392]);
%--------------------------------------------
%用于訓練的數據
ytrain=original(1,1:2:392)';
xtrain(:,:,1)=original([2 5 7],1:2:392);
xtrain(:,:,2)=original([3 4 5],1:2:392);
%--------------------------------------------
%用于測試的數據
ytest=original(1,2:2:262)';
xtest=original([2 5 7],2:2:262);
status=fclose(fid);
%--------------------------------------------
%初始化變量
c=3;? ?? ?? ?? ?? ?? ?? ?? ?? ???%規則數
r=0.01;
n=168;
dis=1;
ntest=size(xtest,2)
datasize=size(xtrain,1);
RMSESUM=0;
coll=0.2;? ?? ?? ?? ?? ?? ?? ?? ?%協同系數
L=7? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?%用于交叉驗證方法,將測試數據分組數
%--------------------------------------------
%初始化矩陣
v=zeros(c,datasize,2);? ?? ?? ???%原形矩陣
sigma=zeros(c,datasize,2);? ?? ? %協方差矩陣
d=zeros(c,n,2);? ?? ?? ?? ?? ?? ?%距離矩陣
u=rand(c,n,2);? ?? ?? ?? ?? ?? ? %模糊劃分矩陣
p=zeros(1,c,2);? ?? ?? ?? ?? ?? ?%規則概率
w=ones(c,2);? ?? ?? ?? ?? ?? ?? ?%權值
first=ones(n,1);
[center,u(:,:,1),objFcn] = fcm(xtrain(:,1:n,1)',c);? ?? ???%模糊劃分矩陣的初始化
[center,u(:,:,2),objFcn] = fcm(xtrain(:,1:n,2)',c);? ?? ???%模糊劃分矩陣的初始化
%--------------------------------------------
%交叉驗證,分七組,其中六組訓練,一組測試
for p=1:L
AA=xtrain;BB=ytrain;
pr=(p-1)*28+1;
for pp=1:28
BB(pr)=[];
AA(:,pr,:)=[];
end
data=AA;
y=BB;
validationx=xtrain(:,(pr:pr+27),1);
validationy=ytrain(pr:pr+27);
fi(:,:,1)=data(:,:,1)';
fi(:,:,2)=data(:,:,2)';
%--------------------------------------------
%計算前件參數--原形矩陣v
while(dis>r)
oldu=u;
for i=1:c
for j=1:datasize
A(i,j,1)=0;
A(i,j,2)=0;
B(i,1)=0;
B(i,2)=0;
C(i,j,1)=0;
C(i,j,2)=0;
D(i,j,1)=0;
D(i,j,2)=0;
for k=1:n
A(i,j,1)=A(i,j,1)+u(i,k,1)^2*data(j,k,1);
A(i,j,2)=A(i,j,2)+u(i,k,2)^2*data(j,k,2);
B(i,1)=B(i,1)+u(i,k,1)^2;
B(i,2)=B(i,2)+u(i,k,2)^2;
C(i,j,1)=C(i,j,1)+(u(i,k,1)-u(i,k,2))^2*data(j,k,1);
C(i,j,2)=C(i,j,2)+(u(i,k,2)-u(i,k,1))^2*data(j,k,2);
D(i,j,1)=D(i,j,1)+(u(i,k,1)-u(i,k,2))^2;
D(i,j,2)=D(i,j,2)+(u(i,k,2)-u(i,k,1))^2;
end
v(i,j,1)=(A(i,j,1)+coll*C(i,j,1))/(B(i,1)+coll*D(i,1));
v(i,j,2)=(A(i,j,2)+coll*C(i,j,2))/(B(i,2)+coll*D(i,2));
end
end
%--------------------------------------------
%計算前件參數--sigma
for i=1:c
for j=1:datasize
sumdv1=0;
sumdv2=0;
for k=1:n
sumdv1=sumdv1+u(i,k,1)*(data(j,k,1)-v(i,j,1))^2;
sumdv2=sumdv2+u(i,k,2)*(data(j,k,2)-v(i,j,2))^2;
end
sigma(i,j,1)=sumdv1/sum(u(i,:,1));
sigma(i,j,2)=sumdv2/sum(u(i,:,2));
end
end
%--------------------------------------------
%計算后件參數--th
for i=1:c
bet1=diag(u(i,:,1));
bet2=diag(u(i,:,2));
th(:,i,1)=inv([fi(:,:,1) first]'*bet1*[fi(:,:,1) first])*[fi(:,:,1) first]'*bet1*y;
th(:,i,2)=pinv([fi(:,:,2) first]'*bet2*[fi(:,:,2) first])*[fi(:,:,2) first]'*bet2*y;
end
%--------------------------------------------
%計算規則的概率p和權值w
for i=1:c
p(i,1)=sum(u(i,:,1))/n;
p(i,2)=sum(u(i,:,2))/n;
wdown1=1;
wdown2=1;
for j=1:datasize
wdown1=wdown1*(sigma(i,j,1)*2*pi);
wdown2=wdown2*(sigma(i,j,2)*2*pi);
end
if sqrt(wdown1)==0;
w(i,1)=1;
else
w(i,1)=p(i,1)/sqrt(wdown1);
end
if sqrt(wdown2)==0;
w(i,2)=1;
else
w(i,2)=p(i,2)/sqrt(wdown2);
end
end
%--------------------------------------------
%計算樣本到原形距離矩陣d
for i=1:c
for k=1:n
fexp1=1;
fexp2=1;
for j=1:datasize
fexp1=fexp1*exp(-(data(j,k,1)-v(i,j,1))^2/(2*sigma(i,j,1)));
fexp2=fexp2*exp(-(data(j,k,2)-v(i,j,2))^2/(2*sigma(i,j,2)));
end
d(i,k,1)=qz(i,1)*fexp1;
d(i,k,2)=qz(i,2)*fexp2;
end
end
%--------------------------------------------
%更新模糊劃分矩陣u
uu(:,:,1)=coll*u(:,:,1);
uu(:,:,2)=coll*u(:,:,2);
for i=1:c
for a=1:n
if sum(d(:,a,1))<=0
u(i,a,1)=0;
else
u(i,a,1)=(coll*uu(i,a,1))/(coll+1)+(d(i,a,1)/sum(d(:,a,1)))*(1-sum(uu(:,a,1))/(1+coll));
end
if sum(d(:,a,2))<=0
u(i,a,2)=0;
else
u(i,a,2)=(coll*uu(i,a,2))/(coll+1)+(d(i,a,2)/sum(d(:,a,2)))*(1-sum(uu(:,a,2))/(1+coll));
end
end
end
dis=sum(sum(oldu(:,:,1)-u(:,:,1)).^2)/n*c;
dis=sqrt(dis);
end
trainy=testing(validationx,w(:,1)',c,th(:,:,1),sigma(:,:,1),v(:,:,1));? ?? ?? ? %模型對每組訓練數據的輸出
TRAINRMSE=sqrt(sum((validationy-trainy').^2)/42);? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? %每組訓練數據的RMSE
RMSESUM=RMSESUM+TRAINRMSE;? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?%每組訓練數據的RMSE和
end
%--------------------------------------------
%訓練及測試RMSE
trainRMSE=RMSESUM/L
testy=testing(xtest,w(:,1)',c,th(:,:,1),sigma(:,:,1),v(:,:,1));? ?? ?? ?? ?? ???%模型對測試數據的輸出,參數采用第一組特征子集的參數
testRMSE=sqrt((sum((ytest-testy').^2))/ntest)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???%測試數據的RMSE
%--------------------------------------------
%測試的擬合圖
put=1:ntest;
plot(put,ytest,'-',put,testy',':')
ylabel('MPG')
xlabel('樣本')
h=legend('實際輸出','模型輸出',2);
總結
以上是生活随笔為你收集整理的模糊聚类划分matlab代码,Matlab协同模糊聚类建模的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】使用奇异值分解(SVD)构建
- 下一篇: 【Python】核酸结果统计难?复旦博士