本篇最適合初學者進行自學學習,建議把本篇的代碼自己敲一遍。
數據集已放出,在博主的下載界面自行下載
%%生成3個類別的數據(每個類別20個樣本)
% data=randn(2,60); %第1類均值 0,0
% data(:,21:40)=data(:,21:40)+7; %第2類均值 7,7
% data(1,41:60)=data(1,41:60)+7; %第3類均值 7,-7
% data(2,41:60)=data(2,41:60)-7;
% scatter(data(1,1:20),data(2,1:20),'*');
% hold on;
% scatter(data(1,21:40),data(2,21:40),'+');
% hold on;
% scatter(data(1,41:60),data(2,41:60),'.');
% hold on;
data=reshape(trdata,784,60000);
data=data./255;
%數據升1維,定義權重向量w
data(785,:)=ones(1,60000);
%定義類別標籤
z=-1.*ones(10,60000);
for ab=1:10
z(ab,sum(trnum(1:ab-1))+1:sum(trnum(1:ab)))=1;
end
% z(1,1:20)=1;
% z(2,21:40)=1;
% z(3,41:60)=1;
%將類別標籤與數據相乘
olddata=data;
w=randn(785,10);
for rst=1:10
%data=olddata;
% for i=1:60000
% data(:,i)=data(:,i).*z(rst,i);
% end
w(:,rst)=inv(data*data'+0.001.*eye(785,785))*data*z(rst,:)';
%使用隨機生成的初始權重得到分類的結果result1
% for i=1:60000
% result1(:,i)=w(:,rst)'*data(:,i);
% end
% x1=[-4,8];
% x2=-1.*(w(1,rst).*x1+w(3,rst))./w(2,rst);
% plot(x1,x2);
% hold on;
% end
% for s=1:3000 %採用梯度下降法和線性感知機進行迭代優化,迭代次數爲100
% for i=1:60000 %使用第s次的學習結果w來獲得本次分類器的輸出result1
% result1(:,i)=w(:,rst)'*data(:,i);
% end
%
% %計算梯度
% dydx=zeros(785,1);
% for i=1:60000
% if(result1(:,i)<=0)
% dydx=dydx+data(:,i);
% end
% end
% dydx=-1.*dydx;
%
% amda=0.001; %學習率,步長
% w(:,1)=w(:,1)-amda.*dydx; %使用負梯度更新權重w
% end
aa=rst
%作圖
% x1=[-4,8];
% x2=-1.*(w(1,1).*x1+w(3,1))./w(2,1);
% plot(x1,x2);
% hold on;
end
for j=1:10
for i=1:60000 %使用第s次的學習結果w來獲得本次分類器的輸出result1
result2(j,i)=w(:,j)'*data(:,i);
end
end
label=ones(1,60000);
for i=2:10
label(sum(trnum(1:i-1))+1:sum(trnum(1:i)))=i;
end
tedata=reshape(tedata,784,10000);
tedata=tedata./255;
tedata(785,:)=ones(1,10000);
for j=1:10
for i=1:10000 %使用第s次的學習結果w來獲得本次分類器的輸出result1
result3(j,i)=w(:,j)'*tedata(:,i);
end
end
data=olddata;
for i=1:60
data(:,i)=data(:,i).*z(2,i);
end
for i=1:60
result1(:,i)=w(:,2)'*data(:,i);
end
for s=1:1000
for i=1:60
result1(:,i)=w(:,2)'*data(:,i);
end
dydx=zeros(3,1);
for i=1:60
if(result1(:,i)<=0)
dydx=dydx+data(:,i);
end
end
dydx=-1.*dydx;
amda=1;
w(:,2)=w(:,2)-amda.*dydx;
end
x1=[-4,8];
x2=-1.*(w(1,2).*x1+w(3,2))./w(2,2);
plot(x1,x2);
hold on;
data=olddata;
for i=1:60
data(:,i)=data(:,i).*z(3,i);
end
for i=1:60
result1(:,i)=w(:,3)'*data(:,i);
end
for s=1:1000
for i=1:60
result1(:,i)=w(:,3)'*data(:,i);
end
dydx=zeros(3,1);
for i=1:60
if(result1(:,i)<=0)
dydx=dydx+data(:,i);
end
end
dydx=-1.*dydx;
amda=1;
w(:,3)=w(:,3)-amda.*dydx;
end
x1=[-4,8];
x2=-1.*(w(1,3).*x1+w(3,3))./w(2,3);
plot(x1,x2);
hold on;
%x2=-(w1*x1+w3)/w2;
%w1=randn(1,1);
%w2=randn(1,1);
%w3=randn(1,1);
%w(1)*x(1)+w(2)*x(2)+b=0
%w'x+b=0;
w=randn(2,1);
b=randn(1,1);
%w=randn(784,1);
b=randn(10,1);
w=randn(784,10);
for i=1:60000
results(:,i)=w'*trdata(:,i)+b;
end
[maxv,indexv]=max(results);
%w1*x1+w2*x2+...+w784*x784+w785=0;
%data(1,1)*w1+data(2,1)*w2+w3
for i=1:40
result(i)=w'*data(:,i)+b;
end
%x2=-(w1*x1+w3)/w2;
x1=[-4,8];
x2=-1.*(w(1).*x1+w(3))./w(2);
plot(x1,x2);
%data(2,1)
for i=21:40
scatter(data(1,i),data(2,i),'+');
hold on;
end
第一步,我們將data進行變形,拉伸一下,改變形狀
然後我們再定義類別標籤
【因爲trnum都告訴我們,trnum到底是什麼意思,下次解決】
這個意思,讓第一個類別1到6742爲1
讓第二個類別,從6743到6743+5958爲2
如圖,分錯了ay<0,所以我們就加一個yj
權重+yi,相當於 結果+yi方
加一個eye是正則化,放置語句歧義
我們用10個分類器的預測的結果,不僅消除了盲區。
而且準確率方面,通過線性分類器(80%)比以前模板的方法(40%)更好。