開課以來沫浆,已經(jīng)僥幸過了三關(guān)。
線性代數(shù)這關(guān)最難過滚秩,足用了4個(gè)星期专执,7次審閱,值得寫篇文來復(fù)盤一下:
難度:
1.線性代數(shù)本身的難度郁油。大學(xué)時(shí)候沒有學(xué)過線性代數(shù)本股,半途撿起,難度可想而知桐腌。
- 用python進(jìn)行線性代數(shù)的運(yùn)算拄显,而且不能用numpy和pandas等數(shù)據(jù)包。所以必須在矩陣中進(jìn)行循環(huán):行是一個(gè)循環(huán)案站,列是另一個(gè)循環(huán)躬审,大循環(huán)套小循環(huán)來獲取每一個(gè)元素。
課堂視頻講的挺好蟆盐,可能是進(jìn)度比較慢的緣故承边,我覺得比可汗學(xué)院的更清楚一點(diǎn),理解的更透徹石挂。但所有的練習(xí)感覺都挺難的博助,我自己覺得示例代碼寫得有點(diǎn)繞。沒在這上面深究痹愚,照著視頻寫了一遍就算了富岳。
項(xiàng)目回顧:
生成單位矩陣罗心,
這里拋棄了np.array和pd.Series,就用樸素的列表轉(zhuǎn)矩陣城瞎。
矩陣的轉(zhuǎn)置渤闷,
原來我的做法是直接寫成:zip(*M): 但最終的數(shù)據(jù)結(jié)構(gòu)會(huì)是元組列表tuple list。而元組元素是不可修改的脖镀。所以需要改動(dòng)一下飒箭。
矩陣的乘法,
重點(diǎn)是相乘的條件:A的列數(shù)要等于B的行數(shù)蜒灰。
判斷后做三個(gè)循環(huán)弦蹂,A的行數(shù),A的列數(shù)强窖,B的列數(shù)凸椿。
然后就是一塊大項(xiàng):
高斯消元法
構(gòu)造增廣矩陣,
還是zip函數(shù)的應(yīng)用:
初等行變換
交換兩行
把某行乘以一個(gè)非零常數(shù)
把某行加上另一行的若干倍
這三個(gè)不算很難翅溺,定位好了M[i][j]直接寫公式就行了脑漫。
Gaussian Jordan 消元法求解 Ax = b
算法如下:
步驟1 檢查A,b是否行數(shù)相同
步驟2 構(gòu)造增廣矩陣Ab
步驟3 逐列轉(zhuǎn)換Ab為化簡(jiǎn)行階梯形矩陣
對(duì)于Ab的每一列(最后一列除外) 當(dāng)前列為列c 尋找列c中 對(duì)角線以及對(duì)角線以下所有元素(行 c~N)的絕對(duì)值的最大值
如果絕對(duì)值最大值為0
那么A為奇異矩陣咙崎,返回None (你可以在選做問題2.4中證明為什么這里A一定是奇異矩陣)
否則
使用第一個(gè)行變換优幸,將絕對(duì)值最大值所在行交換到對(duì)角線元素所在行(行c)
使用第二個(gè)行變換,將列c的對(duì)角線元素縮放為1
多次使用第三個(gè)行變換褪猛,將列c的其他元素消為0
步驟4 返回Ab的最后一列
先做手算消元网杆,對(duì)于手殘星人,這個(gè)也過了兩個(gè)審閱期伊滋。期間居心不良碳却,試圖找在線計(jì)算器不果......
然后,就是痛苦漫長(zhǎng)的高斯消元法的函數(shù)笑旺。
其實(shí)本身難度并不高昼浦,高斯消元法,在網(wǎng)易-可汗學(xué)院課上燥撞,大概第6個(gè)視頻就講到了座柱。但是明白原理是一回事迷帜,用代碼編寫又是另一回事物舒。
大概世界上并不多有人不用包,而用樸素的Python代碼寫這種函數(shù)戏锹,所以沒有百度到答案冠胯。
這個(gè)函數(shù)比較長(zhǎng),bug也特別多锦针,一開始沒想到正確方法荠察,單是第一步置蜀,求每列最大值就想了半天。因?yàn)椴荒苡胣umpy, pandas這些包悉盆,所以要用大循環(huán)套小循環(huán)盯荤。python基礎(chǔ)還是不牢的人,就經(jīng)常被繞進(jìn)去焕盟,做的很痛苦秋秤。
線性回歸
隨機(jī)生成樣本點(diǎn),猜測(cè)一條直線脚翘,然后計(jì)算平均平方誤差灼卢。
def calculateMSE(X,Y,m,b):
......
return MSE
print(calculateMSE(X,Y,m,b))
找到最優(yōu)參數(shù) m,b 使得平方平均誤差最小。
'''
參數(shù):X, Y
返回:m来农,b
'''
X,Y = generatePoints(seed,num=100)
def linearRegression(X,Y):
......
return m,b
m,b = linearRegression(X,Y)
print(m,b)
這里開始搞不明白的是X鞋真,Y是100個(gè)點(diǎn)的矩陣,如何推出h=[m,b]的矩陣沃于,但打印出來發(fā)現(xiàn)XT*X的形狀涩咖,居然就是神奇的1x2矩陣。原理不是很明白繁莹,但這樣解出m,b就不困難了抠藕。
記得求出的是矩陣?yán)锴短琢斜恚斜碇性偾衅攀菙?shù)值蒋困。
最后得圖形如下:
經(jīng)過漫長(zhǎng)的分析盾似,總算對(duì)對(duì)于線性代數(shù),多維空間和方程計(jì)算有了基本的了解雪标。在機(jī)器學(xué)習(xí)入門告一階段后零院,要好好的把線代系統(tǒng)的學(xué)習(xí)一次。(希望真的能做到~~)