全部exercise的總結

這幾天,第二次刷完了courera的8個習題,收穫還是蠻大的。


最先學習的就是線性迴歸,也是理解最透徹的一個。線性迴歸的根本目的就是使得樣本集中儘可能多的點集中分佈在所畫的線上。所以先推出來一個式子就是Y = WX + b。而我們要做的就是讓計算得出的Y與真實的y的差距儘可能小。所以我們引入了損失函數,爲了避免正負的影響,我們使用平方項,爲了求導簡單,我們使用1/2的係數。那麼如何優化模型呢,肯定是對係數進行調整,有那麼多係數,應該如何統一進行處理呢,我們採用了梯度下降法:


最終得到模型。

當然,除了梯度下降法還有別的方法。無論如何,我們取得的都是局部最低點(損失最少)。所以我們可以直接找到導數爲0的地方,這樣做也是可以的,得到的結果也是對的,但要注意的就是這種方法所適用的是小規模的數據。因爲大規模的矩陣計算太過麻煩,甚至可能超出內存。


之後學習的是邏輯迴歸。不同的一點就是:

                     

其實原理相同,但現在的目的不同了。原來爲了迴歸,而現在爲的是分類。引入g的目的就是這個函數在計算的時候取值的特殊性,可以完美的通過輸入的X將樣本分爲兩類。

J也稍有不同:


但其他都和之前一樣。在這個實驗中,引入了懲罰


引入懲罰的最終目的就是更好的挑選有用參數。

這樣在使用梯度下降法的時候就有了一點差異:


多分類問題和神經網絡

之前的二分類問題中,y的取值爲0和1.現在在多分類問題中,不過增加了y可以取得的值,剩下的什麼都沒有變。

之後的one VS all指的就是先將不同類的樣本進行分類,然後專門針對類內部進行學習,其實就是專門針對一個類設定參數。

然後在這裏接觸了神經網絡。

在這裏的神經網絡特別淺顯,其實就是變相的線性迴歸,不過將線性迴歸進行了兩次,正統的神經網絡在下一次實驗中。

正宗的神經網絡

最重點的部分:向後傳播

without regularization


with regularization



代碼如下,練習了好多遍的呀:

%如果要計算J的話,需要將輸入的向量y進行處理
%y的數值對應的部分爲1,其他部分爲0。
y_cacu=zeros(m,num_labels);
for i=1:size(y_cacu,1)
    y_cacu(i,y(i))=1;
end
%現在開始複習神經網絡的過程
X=[ones(m,1) X];
a1=sigmoid(X*Theta1');
a1=[ones(m,1) a1];
a2=sigmoid(a1*Theta2');

theta1_t=[zeros(size(Theta1,1),1) Theta1(:,2:end)];
theta2_t=[zeros(size(Theta2,1),1) Theta2(:,2:end)];
cost=y_cacu .* log(a2) + (1 - y_cacu) .* log(1 - a2);
cost=-sum(sum(cost))/m;
theta1_t = theta1_t.^2;
theta2_t = theta2_t.^2;
J=cost + lambda / (2 * m) *(sum(sum(theta1_t)) + sum(sum(theta2_t)));
%%=========================================================================
%%=========================================================================
%現在開始正式進行本文的運算
grad1=zeros(size(Theta1));
grad2=zeros(size(Theta2));
for i=1:m
    a1=X(i,:)';%401x1
    z2=Theta1*a1;%25x1
    a2=sigmoid(z2);%25*1;
    a2=[1;a2];%26x1
    z3=Theta2*a2;%10x1
    a3=sigmoid(z3);%10x1
    
    %之後開始計算損失
    %error3
    error3=zeros(size(a3));
    for j=1:num_labels
        error3(j)=a3(j)-(y(i)==j);
    end
    %error2
    error2=Theta2'* error3;
    error2=error2(2:end,:) .* sigmoidGradient(z2);
    
    %計算gradient
    grad2 = grad2 + error3 * a2';
    grad1 = grad1 + error2 * a1';
end
Theta1_temp = [zeros(size(Theta1,1),1) Theta1(:,2:end)];
Theta2_temp = [zeros(size(Theta2,1),1) Theta2(:,2:end)];
Theta1_final=grad1 / m + lambda / m * Theta1_temp;
Theta2_final=grad2 / m + lambda / m * Theta2_temp;
grad = [Theta1_final(:) ; Theta2_final(:)];
看着自己寫的代碼,超級自豪,超級驕傲。


使用極差和方差對正規化的線性模型進行調整和優化

在這裏加入了驗證集。

第一部分就是不斷加入樣本,進行訓練,然後測量訓練集和驗證集的誤差。

最後會得出這樣的圖形:


之後進行了Polynomial regression,說白了就是不管以x的每一個屬性爲一個維度,而是對屬性進行k次方的運算,然後再構建模型。


在這裏需要學到的東西還不是很多,有點東西有一點涉及,等到後面詳細展開講。

最讓人頭疼的SVM。練習本身並不難,但算法的真正思想卻並不簡單。

SVM最直觀的目的就是分類。對於分類已經有邏輯迴歸了。那要SVM幹什麼,就是爲了處理複雜的情況。這麼說可能很不準確,但的確SVM可以處理很多很複雜的情況。SVM是一個large margin classifier。

這是在知乎上找到的區別,原網址爲點擊打開鏈接


其實最直觀的不同就是一個有margin,所以受到個別數據的影響小,一個沒有margin,所以受到的影響大

損失函數不用,所以所做的trade off不同。

要說明一下參數的選擇:

C增大,lambda減小,偏差(bias降低),variance(方差)增大

arfa方增大,圖像變扁平,容易過擬合

聚類和PCA,感覺後面的都是大頭啊啊啊啊

聚類比較簡單,我也理解的比較透徹

尋找中心點:


重新確定一個類的中心點座標:


之後就是PCA,其實就是用一個低維矩陣左乘樣本矩陣,獲得的結果除了對角線元素儘量爲0(各個維度不相關),按照對角線元素從大到小排列,找出前K列最大的,就是得到的降低到爲K維基向量。

之後的具體操作,都在exercise7這篇blog中了,不再贅述。

之後就是對於大數據的一個初步入門了。在這個實驗中,就是首先計算了均值和標準差,之後利用查全率,查準率,F1找到最好閾值,最後對用戶,屬性求導,求損失,就完事了。但這個事情本身還是比較複雜的,需要再進一步學習。


以上,就是我做完的全部練習題。











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