沒錯啦,就是Coursera上吳恩達的課。什么,第一篇筆記為啥從第二周開始?不好意思啦,第一周都在筆記本上呢,還沒開簡書哈哈哈~
多變量回歸
第二周V1-V2首先講了Multiple feature的線性回歸梯度下降方法,其實就是多變量函數,大概用到求偏導之類的簡單推導即可得到通式,和單變量是一致的。
V3則是說明多feature的情況下,scaling類似非常重要,feature之間相對一致的scaling可以加快梯度下降的迭代速度。實現這一點只要做些normalization之類的統計處理即可,與氣象上的變量標準化的思路是一樣的,距平除以數據的range或者標準差。
V4首先介紹如何檢測正在執行的梯度下降是有效的,很簡單,把cost function的值在每輪iteration后拿出來看看就可以啦,在一定迭代次數后cost function收斂到某值即可。當然也可以使用automatic convergence test,就是看每輪梯度下降對cost function的減少是否低于某閾值。之后則是介紹如果發現cost function出現了隨著迭代次數增加而發散或周期性振蕩的情況,則需要調小learning rate(傳說中的調參民工干的事情么)。這和氣象模式積分不穩定的時候需要調小積分步長類似,有著一致的出發點和處理思路。當然,隨之帶來的則是計算量的顯著提升。Andrew隨后給出了實際應用中他所采取的方法,給一個等比數列的alpha,大概按3x增加,然后都來train一遍,最后選個收斂相對快且足夠小的alpha即可。
V5講了多feature的選擇問題,這對建模是非常重要的,也說明背景領域知識的重要性。Andrew舉了個具體的例子,比如在有了house長和寬兩個指標的情況下,預測房價顯然用長寬的乘積,也就是面積,作為新的feature是更合理的。同時,若feature和房價的關系更可能是多項式關系,三次回歸顯然比二次回歸合理,因為二次回歸拋物線性質會使得feature大的時候price反而減小,這是不合常識的。當然更合理的假設可能是下面的形式:
當然形式本身并不反映mechanism,我們的目標是湊出最有效的預測嘛。
多項式回歸依然采用梯度下降處理(體現出梯度下降相比最小二乘的優勢了吧),只是要注意scaling非常重要,因為feature的高次冪值域會顯著擴大。
Normal Equation
好吧剛剛懟了最小二乘這里就介紹了。以一階線性回歸為例,求導,set=0,得到解析解。一般化的,對于theta0-n共n+1個feature,構建design matrix X,轉置觀測列向量并依觀測放入X的每一行即可,即m觀測行乘以n特征列矩陣:
y則是對應label的列向量。
然后Andrew直接給出了求theta的Normal Equation:
視頻中沒有給出推導過程,自己試著推導了一下,對cost function求導并set為0向量。還是需要用到一些矩陣運算的性質(好了,不要吐槽我autodraw的清奇畫風):
用Normal equation的話不需要考慮scaling的問題, which is nice。Andrew對梯度下降和NE的優缺點做了個很好的對比:
劃重點,由于NE的時間復雜度是O(n^3),n如果很大,也就是說feature很多的話,NE會很慢,n~10^6必然要使用GD啦,Andrew建議10^4以上采用GD。另外對于clustering類的問題,NE是無效的,GD無敵。
V2介紹NE的noninvertibility的問題。如果X'X是不可逆的話,比如是singular或者degenerate矩陣。Andrew沒有講具體數學細節,而是給出實際應用中出現這樣情況的可能情形:
1. redundant features 存在冗余特征。
2. 觀測樣本太少,而feature太多。
Octave/Matlab Tutorial
來來來,一起復習下matlab語法與交互式操作
2==4?
3~=4 注意不是!=
1 && 0 ?; 3 || 3; xor (1,0)=1
預定義常量 pi
disp(sprintf('2 decimals: %0.2f', a))
v=1:0.1:2 % from 1 to 2, step 0.1
ones(2,3) % 2x3
zeros(); rand(); randn() % normalized distribution
生成高斯樣本:
對角矩陣 eye(n)
size(ones(2,3))
2 ?3
A=[1 2; 3 4; 5 6]
load('xxx.dat')
who %返回目前內存中的變量
whos %列表化變量
clear A %刪除變量
save hello.mat v; %保存目前的交互中使用的內存變量v
subset就不記錄了。
append操作
A=[A, [22,33,44] %列向量append
[A B] %行拼接(橫向)
[A B] %列拼接(縱向)
A' % transpose A
[val, ind] = max(A)
find(a<3)
sum(a); prod(a)
max(A,[],1) %max among each col
max(A,[],2) %max among each row
flipud(A) %上下翻轉
pinv(A) %pseudo求逆
print -dpng 'test.png'
clf %clear all figures
imagesc(A) % gridfilling show the matrix
Vectorization:
當然要向量化操作啦~?
所以update假設的向量化非常簡單
quiz里注意一下,矩陣按位取平方與矩陣平方是不同概念
A^2 ~= A.^2
編程大作業就實現梯度下降求線性回歸啦。submission system還是很牛的,提供郵箱和coursera的token就可以自動上傳評分,沒想到我這個audit還可以交作業,不錯不錯。
當然additional也要做得啦
不是總結的總結
第二周感覺還不算難,基本概念還是夠用的,只是線性代數不少忘記了,matlab的函數也不太熟悉,向量化操作還要腦補半天矩陣圖景。視頻1.25x播放速度基本可以接受,講程序的時候不需要subtitle,慢慢試著講課也去掉subtitle吧,其實主要是一些符號的名詞不熟悉,比如semicolon 什么的要反應半天。toggl記錄的總用時如下:
五小時17分,基本都是在今天完成的啦。視頻+筆記+編程作業,這個時間還算滿意,再接再厲。