標題:
模式識別算法matlab程序 壓縮 剪輯近鄰法 parzen窗 c均值算法 bayes判別
[打印本頁]
作者:
lisai
時間:
2017-4-22 21:12
標題:
模式識別算法matlab程序 壓縮 剪輯近鄰法 parzen窗 c均值算法 bayes判別
關于模式識別中的一些算法的matlab程序
bayes判別\
c均值算法\
parzen窗\
剪輯近鄰法\
壓縮近鄰法\
0.png
(46.77 KB, 下載次數: 61)
下載附件
2017-4-22 22:22 上傳
源碼下載:
模式識別.rar
(7.61 KB, 下載次數: 16)
2017-4-22 21:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
下面是剪輯近鄰法源碼:
%% 剪輯近鄰法
%% 初始化操作
clc
close all
clear all
n=100;
N=3*n;
%% 訓練樣本1 二維聯合正態(tài)分布的期望和方差,并隨機產生 N 個樣本
mu1=[2 3];
SIGMA1=[20 1.5; 1.5 30];
tra_sam1 = mvnrnd(mu1,SIGMA1,N);
%% 訓練樣本2 二維聯合正態(tài)分布的期望和方差,并隨機產生 N 個樣本
mu2=[10,11];
SIGMA2=[20 1.5;1.5 30];
tra_sam2 = mvnrnd(mu2,SIGMA2,N);
%% 保留原始樣本
tra_sam_org1=tra_sam1;
tra_sam_org2=tra_sam2;
%% 對樣本進行分類,分為3類
num0=0; %% 用于存放上一次剪輯后樣本個數
edit_time=0; %% 記錄剪輯次數
m=0; %% 記錄沒有可被剪輯樣本的連續(xù)次數
N1=N;N2=N; %%分別記錄剪輯后樣本類1,類2的樣本個數
while m<5
m11=1;m21=1;m31=1;
m12=1;m22=1;m32=1;
%% 將樣本分成三類
for i=1:N1
t=rand;
if t<=0.33
cell_sam11(m11,:)=tra_sam1(i,:);
m11=m11+1;
elseif t<=0.66
cell_sam21(m21,:)=tra_sam1(i,:);
m21=m21+1;
else
cell_sam31(m31,:)=tra_sam1(i,:);
m31=m31+1;
end
end
for i=1:N2
s=rand;
if s<=0.33
cell_sam12(m12,:)=tra_sam2(i,:);
m12=m12+1;
elseif s<=0.66
cell_sam22(m22,:)=tra_sam2(i,:);
m22=m22+1;
else
cell_sam32(m32,:)=tra_sam2(i,:);
m32=m32+1;
end
end
%% 對子集進行剪輯,去掉錯分的樣本
%% 利用子集2,對子集1中的cell_sam11進行裁剪
cell_sam11=cutting(cell_sam11,cell_sam21,cell_sam22);
%% 利用子集2,對子集1中的cell_sam12進行裁剪
cell_sam12=cutting(cell_sam12,cell_sam22,cell_sam21);
%% 利用子集3,對子集2中的cell_sam21進行裁剪
cell_sam21=cutting(cell_sam21,cell_sam31,cell_sam32);
%% 利用子集3,對子集2中的cell_sam22進行裁剪
cell_sam22=cutting(cell_sam22,cell_sam32,cell_sam31);
%% 利用子集1,對子集3中的cell_sam31進行裁剪
cell_sam31=cutting(cell_sam31,cell_sam11,cell_sam12);
%% 利用子集1,對子集3中的cell_sam32進行裁剪
cell_sam32=cutting(cell_sam32,cell_sam12,cell_sam11);
%% 剪輯后對樣本進行整理,合并,組成新的訓練樣本
tra_sam1=[cell_sam11;cell_sam21;cell_sam31];
tra_sam2=[cell_sam12;cell_sam22;cell_sam32];
cell_sam11=zeros(1,2);cell_sam21=zeros(1,2);cell_sam31=zeros(1,2);
cell_sam12=zeros(1,2);cell_sam22=zeros(1,2);cell_sam32=zeros(1,2);
[a1,b1]=size(tra_sam1);
[c1,d1]=size(tra_sam2);
num1=a1+c1; %% 計算剩余總樣本個數
N1=a1;
N2=c1;
if (num1-num0==0)
m=m+1;
else
m=0;
end
num0=num1;
edit_time=edit_time+1;
%% 繪制中間過程
if edit_time==1
figure('NumberTitle', 'off', 'Name', '剪輯后樣本點');
scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
hold on
scatter(tra_sam2(:,1),tra_sam2(:,2),50,'kx')
title('剪輯一次后剩余樣本點')
xlabel('特征1')
ylabel('特征2')
legend('類1','類2',2)
elseif edit_time==3
figure('NumberTitle', 'off', 'Name', '剪輯后樣本點');
scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
hold on
scatter(tra_sam2(:,1),tra_sam2(:,2),50,'kx')
title('剪輯三次后剩余樣本點')
xlabel('特征1')
ylabel('特征2')
legend('類1','類2',2)
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
作者:
admin
時間:
2017-4-22 22:26
bayes判別:
% 初始設置
clc
clear all
close all
n=2000; %% 樣本個數為 2*n
n1=0;n2=0; %% 判別為類1的個數為n1,判別為類2的個數為n2
m1=1;m2=1;
error1to2=0;error2to1=0; %% erroritoj為類i判為類j的錯誤個數
% 類別1的二維聯合正態(tài)分布的期望和方差,并隨機產生 n 個樣本
mu1=[3 4];
sigma1=[1 1.5; 1.5 3];
x1 = mvnrnd(mu1,sigma1,n);
%%類別2的二維聯合正態(tài)分布的期望和方差,并隨機產生 n 個樣本
mu2=[8,9];
sigma2=[2 3;3 5];
x2 = mvnrnd(mu2,sigma2,n);
% 判別函數g(x)進行判別
for i=1:1:n
if g(x1(i,:),mu1,sigma1)>=g(x1(i,:),mu2,sigma2)
X1(m1,:)=x1(i,:);
m1=m1+1;
else
X2(m2,:)=x1(i,:);
m2=m2+1;
erroe1to2=error1to2+1;
end
end
for i=1:1:n
if g(x2(i,:),mu1,sigma1)>=g(x2(i,:),mu2,sigma2)
X1(m1,:)=x2(i,:);
m1=m1+1;
error2to1=error2to1+1;
else
X2(m2,:)=x2(i,:);
m2=m2+1;
end
end
%%%%%%繪圖
% 原始樣本點
figure('NumberTitle', 'off', 'Name', '原樣本點');
scatter(x1(:,1),x1(:,2),'r')
hold on
scatter(x2(:,1),x2(:,2),50,'kx')
title('原始樣本')
xlabel('樣本1')
ylabel('樣本2')
legend('第一類樣本','第二類樣本',0);
% 分類后樣本點
figure('NumberTitle', 'off', 'Name', '分類樣本點');
scatter(x1(:,1),x1(:,2),'r')
hold on
scatter(x2(:,1),x2(:,2),50,'kx')
hold on
scatter(X1(:,1),X1(:,2),'r')
hold on
scatter(X2(:,1),X2(:,2),50,'kx')
title('分類后的樣本')
xlabel('樣本1')
ylabel('樣本2')
legend('第一類樣本','第二類樣本',0);
復制代碼
作者:
admin
時間:
2017-4-22 22:27
c均值算法:
%% c-均值算法
%% 初始化操作
clc
close all
clear all
n=100;
N=5*n;
%% 產生5類隨機樣本,假設類別數已知
%% 樣本1
mu1=[2 2];
SIGMA1=[1 1.5; 1.5 3];
tra_sam1 = mvnrnd(mu1,SIGMA1,n);
%% 樣本2
mu2=[20,20];
SIGMA2=[4 3;3 5];
tra_sam2 = mvnrnd(mu2,SIGMA2,n);
%% 樣本3
mu2=[11,11];
SIGMA2=[1 1;1 2];
tra_sam3 = mvnrnd(mu2,SIGMA2,n);
%% 樣本4
mu2=[20,2];
SIGMA2=[2 1.2;1.2 4];
tra_sam4 = mvnrnd(mu2,SIGMA2,n);
%% 樣本5
mu2=[2,20];
SIGMA2=[3 2;2 3];
tra_sam5 = mvnrnd(mu2,SIGMA2,n);
tra_sam=[tra_sam1;tra_sam2;tra_sam3;tra_sam4;tra_sam5];
%% 將樣本隨機分成5類,計算代表點
n1=1;n2=1;n3=1;n4=1;n5=1;
for i=1:N
t=rand;
if t<=0.2
cell_sam1(n1,:)=tra_sam(i,:);
n1=n1+1;
elseif t<=0.4
cell_sam2(n2,:)=tra_sam(i,:);
n2=n2+1;
elseif t<=0.6
cell_sam3(n3,:)=tra_sam(i,:);
n3=n3+1;
elseif t<0.8
cell_sam4(n4,:)=tra_sam(i,:);
n4=n4+1;
else
cell_sam5(n5,:)=tra_sam(i,:);
n5=n5+1;
end
end
%% 求每類的均值
m1=mean(cell_sam1);
m2=mean(cell_sam2);
m3=mean(cell_sam3);
m4=mean(cell_sam4);
m5=mean(cell_sam5);
m=[m1;m2;m3;m4;m5];
cell_sam1=zeros(1,2);cell_sam2=zeros(1,2);
cell_sam3=zeros(1,2);cell_sam4=zeros(1,2);
cell_sam5=zeros(1,2);
n1=1;n2=1;n3=1;n4=1;n5=1;
%% 獲得初始分類
for i=1:N
for j=1:5
distance1(j)=norm(tra_sam(i,:)-m(j,:));
end
[a,b]=min(distance1);
if b==1
cell_sam1(n1,:)=tra_sam(i,:);
n1=n1+1;
elseif b==2
cell_sam2(n2,:)=tra_sam(i,:);
n2=n2+1;
elseif b==3
cell_sam3(n3,:)=tra_sam(i,:);
n3=n3+1;
elseif b==4
cell_sam4(n4,:)=tra_sam(i,:);
n4=n4+1;
else
cell_sam5(n5,:)=tra_sam(i,:);
n5=n5+1;
end
end
%% 移動初始分類的樣本使分類更加合理
j_num=0;j_e1=0;
while (j_num<5)
[cell_sam1,cell_sam2,cell_sam3,cell_sam4,cell_sam5]=y_move(cell_sam1,cell_sam2,cell_sam3,cell_sam4,cell_sam5);
[cell_sam2,cell_sam1,cell_sam3,cell_sam4,cell_sam5]=y_move(cell_sam2,cell_sam1,cell_sam3,cell_sam4,cell_sam5);
[cell_sam3,cell_sam1,cell_sam2,cell_sam4,cell_sam5]=y_move(cell_sam3,cell_sam1,cell_sam2,cell_sam4,cell_sam5);
[cell_sam4,cell_sam1,cell_sam2,cell_sam3,cell_sam5]=y_move(cell_sam4,cell_sam1,cell_sam2,cell_sam3,cell_sam5);
[cell_sam5,cell_sam1,cell_sam2,cell_sam3,cell_sam4]=y_move(cell_sam5,cell_sam1,cell_sam2,cell_sam3,cell_sam4);
%% 計算改變后的誤差平方
m1=mean(cell_sam1);
m2=mean(cell_sam2);
m3=mean(cell_sam3);
m4=mean(cell_sam4);
m5=mean(cell_sam5);
[r1,c1]=size(cell_sam1);
[r2,c2]=size(cell_sam2);
[r3,c3]=size(cell_sam3);
[r4,c4]=size(cell_sam4);
[r5,c5]=size(cell_sam5);
j_e=0;
for i=1:r1
j_e=j_e+norm(cell_sam1(i,:)-m1)^2;
end
for i=1:r2
j_e=j_e+norm(cell_sam2(i,:)-m2)^2;
end
for i=1:r3
j_e=j_e+norm(cell_sam3(i,:)-m3)^2;
end
for i=1:r4
j_e=j_e+norm(cell_sam4(i,:)-m4)^2;
end
for i=1:r5
j_e=j_e+norm(cell_sam5(i,:)-m5)^2;
end
if abs(j_e1-j_e)<=0.001
j_num=j_num+1;
else
j_num=0;
end
j_e1=j_e;
end
% 繪圖
figure('NumberTitle', 'off', 'Name', '待分類樣本點');
scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
hold on
scatter(tra_sam2(:,1),tra_sam2(:,2),'k')
hold on
scatter(tra_sam3(:,1),tra_sam3(:,2),'b')
hold on
scatter(tra_sam4(:,1),tra_sam4(:,2),'y')
hold on
scatter(tra_sam5(:,1),tra_sam5(:,2),'g')
title('待分類樣本點')
xlabel('特征1')
ylabel('特征2')
legend('類1','類2','類3','類4','類5',2)
figure('NumberTitle', 'off', 'Name', '分類后樣本點與正確分類樣本點對比');
scatter(cell_sam1(:,1),cell_sam1(:,2),'rx')
hold on
scatter(cell_sam2(:,1),cell_sam2(:,2),'kx')
hold on
scatter(cell_sam3(:,1),cell_sam3(:,2),'bx')
hold on
scatter(cell_sam4(:,1),cell_sam4(:,2),'yx')
hold on
scatter(cell_sam5(:,1),cell_sam5(:,2),'gx')
hold on
scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
hold on
scatter(tra_sam2(:,1),tra_sam2(:,2),'k')
hold on
scatter(tra_sam3(:,1),tra_sam3(:,2),'b')
hold on
scatter(tra_sam4(:,1),tra_sam4(:,2),'y')
hold on
scatter(tra_sam5(:,1),tra_sam5(:,2),'g')
title('分類后樣本點與正確分類樣本點對比')
xlabel('特征1')
ylabel('特征2')
legend('類1','類2','類3','類4','類5',2)
復制代碼
作者:
admin
時間:
2017-4-22 22:28
壓縮近鄰法:
%% 剪輯近鄰法
%% 初始化操作
clc
close all
clear all
n=100;
N=3*n;
%% 訓練樣本1 二維聯合正態(tài)分布的期望和方差,并隨機產生 N 個樣本
mu1=[2 3];
SIGMA1=[20 1.5; 1.5 30];
tra_sam1 = mvnrnd(mu1,SIGMA1,N);
%% 訓練樣本2 二維聯合正態(tài)分布的期望和方差,并隨機產生 N 個樣本
mu2=[10,11];
SIGMA2=[20 1.5;1.5 30];
tra_sam2 = mvnrnd(mu2,SIGMA2,N);
%% 保留原始樣本
tra_sam_org1=tra_sam1;
tra_sam_org2=tra_sam2;
%% 對樣本進行分類,分為3類
num0=0; %% 用于存放上一次剪輯后樣本個數
edit_time=0; %% 記錄剪輯次數
m=0; %% 記錄沒有可被剪輯樣本的連續(xù)次數
N1=N;N2=N; %%分別記錄剪輯后樣本類1,類2的樣本個數
while m<5
m11=1;m21=1;m31=1;
m12=1;m22=1;m32=1;
%% 將樣本分成三類
for i=1:N1
t=rand;
if t<=0.33
cell_sam11(m11,:)=tra_sam1(i,:);
m11=m11+1;
elseif t<=0.66
cell_sam21(m21,:)=tra_sam1(i,:);
m21=m21+1;
else
cell_sam31(m31,:)=tra_sam1(i,:);
m31=m31+1;
end
end
for i=1:N2
s=rand;
if s<=0.33
cell_sam12(m12,:)=tra_sam2(i,:);
m12=m12+1;
elseif s<=0.66
cell_sam22(m22,:)=tra_sam2(i,:);
m22=m22+1;
else
cell_sam32(m32,:)=tra_sam2(i,:);
m32=m32+1;
end
end
%% 對子集進行剪輯,去掉錯分的樣本
%% 利用子集2,對子集1中的cell_sam11進行裁剪
cell_sam11=cutting(cell_sam11,cell_sam21,cell_sam22);
%% 利用子集2,對子集1中的cell_sam12進行裁剪
cell_sam12=cutting(cell_sam12,cell_sam22,cell_sam21);
%% 利用子集3,對子集2中的cell_sam21進行裁剪
cell_sam21=cutting(cell_sam21,cell_sam31,cell_sam32);
%% 利用子集3,對子集2中的cell_sam22進行裁剪
cell_sam22=cutting(cell_sam22,cell_sam32,cell_sam31);
%% 利用子集1,對子集3中的cell_sam31進行裁剪
cell_sam31=cutting(cell_sam31,cell_sam11,cell_sam12);
%% 利用子集1,對子集3中的cell_sam32進行裁剪
cell_sam32=cutting(cell_sam32,cell_sam12,cell_sam11);
%% 剪輯后對樣本進行整理,合并,組成新的訓練樣本
tra_sam1=[cell_sam11;cell_sam21;cell_sam31];
tra_sam2=[cell_sam12;cell_sam22;cell_sam32];
cell_sam11=zeros(1,2);cell_sam21=zeros(1,2);cell_sam31=zeros(1,2);
cell_sam12=zeros(1,2);cell_sam22=zeros(1,2);cell_sam32=zeros(1,2);
[a1,b1]=size(tra_sam1);
[c1,d1]=size(tra_sam2);
num1=a1+c1; %% 計算剩余總樣本個數
N1=a1;
N2=c1;
if (num1-num0==0)
m=m+1;
else
m=0;
end
num0=num1;
edit_time=edit_time+1;
end
%% -------------------%%
%% 對剪輯好的樣本進行壓縮
grabbag1=tra_sam1;
grabbag2=tra_sam2;
grabbag=[grabbag1;grabbag2];
%% 計算存儲器grabbag中類1和類2 的個數
[gra_r1,column3]=size(grabbag1);
[gra_r2,column4]=size(grabbag2);
%% 隨機選取一個樣本放入store中,
%% 可以等價為隨機選取類1和類2,兩個樣本放入store中
store1=grabbag1(1,:);
grabbag1=grabbag1(2:gra_r1,:);
gra_r1=gra_r1-1;
store2=grabbag2(1,:);
grabbag2=grabbag2(2:gra_r2,:);
gra_r2=gra_r2-1;
gra_r=gra_r1+gra_r2;
sto_num1=2;%% store 的下標
sto_num2=2;
gra_tem=0;
m=0;
while(m<2*gra_r)
t=rand;
if t<=0.5 %% 如果屬于類1
q=randperm(gra_r1);
for i=1:sto_num1-1
distance1(i)=norm(grabbag1(q(1),:)-store1(i,:));
end
for i=1:sto_num2-1
distance2(i)=norm(grabbag1(q(1),:)-store2(i,:));
end
dist_min1=min(distance1);
dist_min2=min(distance2);
if dist_min1>dist_min2 %% 如果判斷錯誤,放入store
store1(sto_num1,:)=grabbag1(q(1),:);
grabbag1=[grabbag1(1:q(1)-1,:);grabbag1(q(1)+1:gra_r1,:)];
gra_r1=gra_r1-1;
sto_num1=sto_num1+1;
end
else %% 如果屬于類2
q=randperm(gra_r2);
for i=1:sto_num1-1
distance1(i)=norm(grabbag2(q(1),:)-store1(i,:));
end
for i=1:sto_num2-1
distance2(i)=norm(grabbag2(q(1),:)-store2(i,:));
end
dist_min1=min(distance1);
dist_min2=min(distance2);
if dist_min1<dist_min2 %% 如果判斷錯誤,放入store
store2(sto_num2,:)=grabbag2(q(1),:);
grabbag2=[grabbag2(1:q(1)-1,:);grabbag2(q(1)+1:gra_r2,:)];
gra_r2=gra_r2-1;
sto_num2=sto_num2+1;
end
end
gra_r=gra_r1+gra_r2;
if gra_r==gra_tem
m=m+1;
else
m=0;
end
gra_tem=gra_r;
end
edit_time
sto_num1=sto_num1-1
sto_num2=sto_num2-1
%% 繪圖
%% 繪制原始樣本點
figure('NumberTitle', 'off', 'Name', '原樣本點');
scatter(tra_sam_org1(:,1),tra_sam_org1(:,2),'r')
hold on
scatter(tra_sam_org2(:,1),tra_sam_org2(:,2),50,'kx')
axis([-20,30,-20,30])
title('原始樣本')
xlabel('特征1')
ylabel('特征2')
legend('類1','類2',2)
%% 繪制剪輯后樣本點
figure('NumberTitle', 'off', 'Name', '剪輯后樣本點');
scatter(tra_sam1(:,1),tra_sam1(:,2),'r')
hold on
scatter(tra_sam2(:,1),tra_sam2(:,2),50,'kx')
axis([-20,30,-20,30])
title('算法終止時樣本點')
xlabel('特征1')
ylabel('特征2')
legend('類1','類2',2)
%% 繪制壓縮后樣本點
figure('NumberTitle', 'off', 'Name', '壓縮后樣本點');
scatter(store1(:,1),store1(:,2),'r')
hold on
scatter(store2(:,1),store2(:,2),50,'kx')
axis([-20,30,-20,30])
title('壓縮后樣本點')
xlabel('特征1')
ylabel('特征2')
legend('類1','類2',2)
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1