機器學習(二)線性分類的最小平方誤差法

本篇最適合初學者進行自學學習,建議把本篇的代碼自己敲一遍。

數據集已放出,在博主的下載界面自行下載

%%生成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%)更好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章