模式識別與機器學習(2)

      參考博客:  http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2961660.html

% %%隨機梯度下降
% clear all;
% x=load('./ex2Data/ex2x.dat');
% y=load('./ex2Data/ex2y.dat');
% %x=[1.15 1.9 3.06 4.66 6.84 7.95 10,14,16]';
% %x=power(x,0.5);
% %y=power(x,0.5)';
% m=length(y);
% figure;
% %tt=power(x(:,1),2);
% plot(x,y,'o');
% ylabel('Height in meters');
% xlabel('Age in years');
% %%Gradient descent 這是批量梯度
% g=inline('1.0./(1.0+exp(-z))');
% x=[ones(m,1)  power(x,1) ];%這是自變量
% theta=zeros(size(x(1,:)))';   %初始化,這裏有兩個係數,其實變量代表的是A
% MAX_ITR=1;%迭代次數
% alpha=0.002; %學習率     %之前這裏爲0.07,所以跑出去了。
% for num_iterations=1:MAX_ITR 
%     for i=1:m
%         t=(g(x(i,:)*theta)-y(i));
%         for j=1:size(x,2)
%             grad=x(i,j)*t;
%             theta(j,1)=theta(j,1)-alpha*grad;   %隨機梯度下降
%         end
%         
%         
%     end
% end                            
% hold on;
% %ttt=power(x(:,2),2);
% plot(x(:,2),power(x,1)*theta,'-');
% legend('Training data', 'Linear regression');%標出圖像中各曲線標誌所代表的意義
% hold off ;

%%批量梯度下降
clear all;
x=load('./ex2Data/ex2x.dat');
y=load('./ex2Data/ex2y.dat');
% x=[1.15 1.9 3.06 4.66 6.84 7.95 10,14,16]';
% x=power(x,0.5);
% y=power(x,0.5);
%tt=power(x(:,1),2);
m=length(y);        %原來是我的 散點畫錯了
figure;
plot(x,y,'o');
ylabel('Height in meters');
xlabel('Age in years');
%%Gradient descent 這是批量梯度
n=1;
x=[ones(m,1) x];%這是自變量
theta=zeros(size(x(1,:)))';   %初始化,這裏有兩個係數,其實變量代表的是A

MAX_ITR=150000;%迭代次數
alpha=0.07; %學習率
for num_iterations=1:MAX_ITR   %懂了上標是什麼意思的,原來是指維度,即對於一個變量來說指取了
    grad=(1/m)*x'*((x*theta)-y);%第幾個實例,一般來說,一張圖像是一個變量,圖像的維度表示數據
        for ii=1:(n+1)
            for jj=1:(n+1)
                H1(ii,jj) = sum( x(:, ii).*x(:,jj), 1)/m;%多個負號,按理是要負號的啊
            end
        end  %這個挺好,這樣對應公式還是挺快的 。    
    
   %theta=theta-inv(H1)*grad; %這是用牛頓法     
    theta=theta-alpha *grad;     %換句話說,譬如這裏的年齡是個變量,取了幾個值,代表着維度。
   %矩陣相乘就是求和了
end                            
hold on;
%tt=power(x(:,2),2);
plot(x(:,2),x*theta,'-');
legend('Training data', 'Linear regression');%標出圖像中各曲線標誌所代表的意義
hold off ;


 
% %%採用normal equations方法求解:
% x=load('./ex2Data/ex2x.dat');
% y=load('./ex2Data/ex2y.dat');
% plot(x,y,'*');
% xlabel('height');
% ylabel('age');
% %x = [ones(50,1),x];
% x = [ones(size(x,1),1),x];  %是指有個x^0  所以係數有兩個
% w=inv(x'*x)*x'*y;
% hold on
% plot(x(:,2),x*w);   %即 plot(x(:,2),0.0639*x(:,2)+0.7502)%更正後的代碼


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