①linear regression
target function的推導(dǎo)
線性回歸是一種做擬合的算法:
誤差
上面的可以看做是一個誤差,這個誤差滿足高斯分布,服從均值為0鳄炉,方差為的高斯分布记靡,也就是高斯分布。因?yàn)榍蟪鰜淼臄M合數(shù)值不是一定就準(zhǔn)確的紊选,肯定會有一些的誤差卖词。
一般誤差不會太多舶替,都是在0上下浮動的抛蚁,所以0附近是最高的概率。
使用linear regression要滿足三個條件:
1.獨(dú)立爷辙,每一個樣本點(diǎn)之間都要相互獨(dú)立血当。
2.同分布领跛,他們的銀行是一樣的郑什,使用的算法是一樣的。
3.誤差都服從高斯分布。
由于誤差是服從高斯分布的,自然有:
上述式子有:
需要求參數(shù)诵叁,自然就是最大似然函數(shù):
log化簡:
最大化這個似然函數(shù)那就是最小化。因?yàn)榍懊娑际浅?shù)玉凯,可以忽略势腮。而這個式子稍微變一下就是最小二乘法了。
最小二乘法:漫仆,不用上面化簡出來的式子非要加上是因?yàn)榍髮?dǎo)之后2是可以和0.5抵消的捎拯。
目標(biāo)函數(shù)的化簡
化簡一下:
求極小值赶熟,直接就是導(dǎo)數(shù)為0即可,所以對求導(dǎo)數(shù)即可。
直接令等于0:回官。
這樣就是得到了最終的目標(biāo)函數(shù)悼尾,一步就可以到達(dá)最終的optimal value沮焕。這就是linear regression肾扰。所以線性回歸是有解析解的切端,直接一條公式就可以求出來的匙奴。注意上面的公式的是不包含bias偏置值非凌,偏置項(xiàng)就是誤差殃姓,代入高斯函數(shù)推導(dǎo)出來的。
②logistic regression
target function 的推導(dǎo)
首先要提一個函數(shù),sigmoid函數(shù):
這個函數(shù)之前被用來做神經(jīng)網(wǎng)絡(luò)的激活函數(shù)丹皱,但是它有一個缺點(diǎn)蛤迎。
這樣的兩個的式子對于求導(dǎo)和化簡都不好灯谣,所以合并一下:
目標(biāo)函數(shù)的化簡
最大似然函數(shù)罗售,常規(guī)操作辜窑,給定了數(shù)據(jù)集找到符合這個數(shù)據(jù)集的分布一般也就是最大似然函數(shù)適合了。所以
log化:
這個方法就梯度下降莽囤,問題來了谬擦,為什么要用梯度下降切距?為什么不可以直接等于0呢朽缎?
logistics regression沒有解析解
如果等于0,就有:考察一下兩個特征兩個樣本的情況:
有三個不同的sigmoid函數(shù)谜悟,兩個式子解不了话肖,因?yàn)閟igmoid函數(shù)不是線性的,如果是線性的葡幸,那么可以吧提出來最筒,這樣就有解了。其實(shí)如果sigmoid去掉蔚叨,僅僅把那么就和linear regression一樣了床蜘。所以是沒有解析解的辙培,主要的原因就是因?yàn)閟igmoid函數(shù)是一個非線性的函數(shù)。
當(dāng)標(biāo)簽不同的時候另一種函數(shù)形式
計(jì)算分?jǐn)?shù)函數(shù)一樣的:
之前了解的preceptron:
直接把score分?jǐn)?shù)通過一個sign函數(shù)即可邢锯。0/1錯誤扬蕊。
linear regression:
logistic regression:
常規(guī)操作尾抑,就是要找到error function先。按照剛剛的函數(shù)分布可以得到:
極大似然函數(shù):
sigmoid函數(shù)有一個比較牛逼的性質(zhì)蒂培。
其實(shí)這個就是交叉熵函數(shù)府适,和上面推導(dǎo)出的:
gradient decent么伯,和剛剛的方法是一樣的疟暖。
上面的可以看做是-yx的線性加權(quán),要求就是加權(quán)和之后為0田柔,而如果是線性可分的話俐巴,則只要為0就可以了;根據(jù)sigmoid函數(shù)的特性硬爆,為0就相當(dāng)于是要 << 0欣舵,即 >> 0,這就尷尬了缀磕,需要保證全部的yx都同號缘圈,都是線性可分的,這樣其實(shí)是很難做到的袜蚕,所以我們轉(zhuǎn)換一個思路糟把,用梯度下降解決。歸根到底牲剃,還是sigmoid函數(shù)的非線性遣疯。
Stochastic Gradient Descent
隨機(jī)梯度下降,以往的經(jīng)驗(yàn)是全部一起做一次更新凿傅,如果計(jì)算量非常大缠犀,那么計(jì)算復(fù)雜度很高数苫,另外如果是做online learning的時候也不方便,因?yàn)檫@個時候數(shù)據(jù)不是一個betch的過來了辨液,而是幾個幾個的了文判。
優(yōu)點(diǎn):簡單,如果迭代次數(shù)夠多的話是可以比得上average true gradient的效果的室梅。
缺點(diǎn):迭代的方向會不穩(wěn)定戏仓,可能會左拐右拐的。average true gradient是查找的當(dāng)前一階導(dǎo)最適合的方向走的亡鼠,而SGD是直接隨機(jī)一個方向走赏殃。
他和PLA其實(shí)很像,而在理解上面其實(shí)也是類似间涵,他們都選取一個點(diǎn)進(jìn)行調(diào)整仁热。而SGD ≈ soft PLA,PLA是錯了之后才糾正勾哩,而SGD會看下你錯了多少抗蠢,錯了越多,意味著你的wx越大思劳,所以糾正的越多迅矛,是動態(tài)可變的,所以也叫做soft PLA潜叛。
③線性模型error function的對比
三個比較簡單算法:PLA秽褒,linear regression,logistic regression威兜。他們勇于分類的時候:
square function對于分類來說其實(shí)不太合理的销斟,分類正確了,應(yīng)該越遠(yuǎn)越好才對椒舵,但是square function是越遠(yuǎn)錯誤就越大蚂踊,是不合理的,logistics就更合理了笔宿,錯誤的越錯就越大正確的就小犁钟,所以linear regression適合回歸而不是分類。
可以看到ce和err0/1是有焦點(diǎn)的措伐,我們乘上一個數(shù)字使他相切:
根據(jù)VC bound的理論:
所有l(wèi)ogistic regression是可以作為分類的特纤,而且他的分類效果要比linear regression好军俊,首先直觀理解錯誤侥加,他比linear regression更合理,其次粪躬,他的VC bound比linear regression要小担败,這就證明了Ein ≈ Eout的概率會更高昔穴,泛化能力更強(qiáng)。
④Nonlinear Transformation
對于線性可分的情況來說提前,幾乎是不用對x做什么預(yù)處理就可以直接使用模型進(jìn)行分類吗货,但是如果是對于非線性的模型,上面的方法就有點(diǎn)吃力了狈网,他們都是線性分類宙搬,直接在model上改進(jìn)有點(diǎn)困難,所以在數(shù)據(jù)上進(jìn)行處理拓哺。
把上面的式子變成我們認(rèn)識的形式:
于是決策函數(shù):
其實(shí)就是把x空間映射到了z空間士鸥,然后再z空間解決闲孤。x里面是nonlinear的,映射到z可能就會是linear的了烤礁,低緯度解決不了的問題拉到高維度解決:
支持向量機(jī)也用到了這種思想讼积,核函數(shù)就是映射到高維度空間里面然后進(jìn)行切片操作。
Nolinear Transformation的方法不止一個:
目前我們所討論的都是過原點(diǎn)的脚仔,如果是不過原點(diǎn)的話勤众,那么他們的VC dimension就會增加。比如這種
其實(shí)鲤脏,做法很簡單决摧,利用映射變換的思想,通過映射關(guān)系凑兰,把x域中的最高階二次的多項(xiàng)式轉(zhuǎn)換為z域中的一次向量掌桩,也就是從quardratic hypothesis轉(zhuǎn)換成了perceptrons問題。用z值代替x多項(xiàng)式姑食,其中向量z的個數(shù)與x域中x多項(xiàng)式的個數(shù)一致(包含常數(shù)項(xiàng))波岛。這樣就可以在z域中利用線性分類模型進(jìn)行分類訓(xùn)練。訓(xùn)練好的線性模型之后音半,再將z替換為x的多項(xiàng)式就可以了则拷。具體過程如下:
整個過程就是通過映射關(guān)系,換個空間去做線性分類曹鸠,重點(diǎn)包括兩個:
特征轉(zhuǎn)換
訓(xùn)練線性模型
Price of Nonlinear Transform
首先煌茬,用十二指腸想都知道:
如果是d維的x做二次的擴(kuò)展,那么有
接下來討論一下x到z多項(xiàng)式的變換:
一維:
二維:
三維:
Q維:
所以這些hypothesis是包含關(guān)系的:
對應(yīng)上圖:
所以一目了然笼蛛,代價就是之間的差距會越來越大,最后就不能再代表了蛉鹿。隨著變換多項(xiàng)式的階數(shù)增大滨砍,雖然逐漸減小,但是model complexity會逐漸增大妖异,造成很大惋戏,所以階數(shù)不能太高。如果選擇的階數(shù)很大他膳,確實(shí)能使接近于0响逢,但是泛化能力通常很差,我們把這種情況叫做tempting sin棕孙。所以舔亭,一般最合適的做法是先從低階開始,如先選擇一階hypothesis蟀俊,看看是否很小钦铺,如果足夠小的話就選擇一階,如果大的話肢预,再逐漸增加階數(shù)矛洞,直到滿足要求為止。也就是說烫映,盡量選擇低階的hypothes沼本,這樣才能得到較強(qiáng)的泛化能力。模型復(fù)雜度越高出現(xiàn)的泛化能力問題锭沟,就是過擬合抽兆,在訓(xùn)練數(shù)據(jù)上表現(xiàn)很好,Ein = 0族淮,但是在測試數(shù)據(jù)上就很差辫红,Ein << Eout凭涂。
⑤Overfitting and Regularization
overfiting,過擬合厉熟,就是上面所描訴的情況了,和相差太遠(yuǎn)了较幌,局部已經(jīng)不能再代表全局了揍瑟,主要原因就是模型復(fù)雜度太大了,VC bound太大乍炉,限制不了绢片。overfitting就是訓(xùn)練過程中翻車了,原因:①太快了岛琼,模型復(fù)雜度太大底循。②近視,看的路太短槐瑞,樣本少熙涤。③這路不行,彎彎曲曲的困檩,noise太多祠挫,噪音太大。
對應(yīng)的解決方法其實(shí)很多悼沿,但主要就是regularization了:
雖然fitting出來的結(jié)果完全符合了數(shù)據(jù)點(diǎn)等舔,但是模型本身沒有這么復(fù)雜,所以產(chǎn)生了過擬合糟趾。
既然模型太復(fù)雜了慌植,那么簡化一下模型:
所以過擬合了,我們可以簡化復(fù)雜度义郑,復(fù)雜度的代表系數(shù)其實(shí)就是VC dimension蝶柿,也就是W的個數(shù)。比如一個十階的hypothesis:
想簡化模型就只需要減少w的個數(shù)即可非驮,比如簡化成2階:
剛剛是規(guī)定了前面的不為0栋盹,現(xiàn)在放寬一下條件施逾,只要3個w不為0就好了,于是有:
這樣就把W限定在了一個以根號C的一個球形里面怎茫,兩個W才是一個圓,多個w就是立體的球了妓灌。
這種線性回歸被看成是origin linear regression的進(jìn)階版新博,也叫ridge regression。
上面的公式也可以直接用拉格朗日乘子法推出來:
拉格朗日:
對于regularization的VC 理論解釋
正則化出來過后的linear regression就是ridge regression,根據(jù)之前的VC bound理論:写隶,其中是復(fù)雜度倔撞,代表的是單個hypothesis的復(fù)雜度,而代表的整個hypothesis set的復(fù)雜度慕趴,所以是被包含在里面的痪蝇,所以相對來說,相對來說會和更加接近躏啰。
General Regularizers
兩個比較常用的:
ridge:L2范數(shù)毫捣,
lasso:L1范數(shù),
ridge推導(dǎo)過了想际,來看看lasso的:
他的正常方向應(yīng)該是垂直于邊界的培漏,紅色的sign就是方向溪厘,而對于在邊界上胡本,只要sign和△Ein不在一條直線上,那么在正方形的邊界上就一定有一個類似于剛剛ridge綠色分量的分量存在畸悬,如上圖侧甫,就會向上方移動,而在邊角點(diǎn)其實(shí)是不可微分的蹋宦,所以一般結(jié)果會聚集在邊角的周圍披粟,所以得到的是一個稀疏矩陣,一些是0冷冗,一些不是零守屉。結(jié)果會聚集在頂點(diǎn)周圍,優(yōu)點(diǎn)就是計(jì)算很快了蒿辙。
上圖是用直觀的理解來解釋regularization拇泛,前面的是用VC demension來解釋,再用數(shù)值分析的角度看一下:
比如:方程式①:
5x + 7y = 0.7
7x + 10y = 1
x = 0 , y = 0.1
方程式②:
5x + 7y = 0.69
7x + 10y = 1.01
x = -0.17 y = 0.22
只要有一點(diǎn)微小的擾動思灌,結(jié)果就會發(fā)生很大的變化俺叭,這就是病態(tài)矩陣,如果是病態(tài)矩陣泰偿,那么兩次的結(jié)果可能會相差很大熄守。是不是病態(tài)矩陣可以用條件數(shù)來判斷。用條件數(shù)來描述病態(tài)矩陣其實(shí)還是太抽象了耗跛。奇異矩陣就是不存在逆矩陣的方陣裕照。什么樣的方陣不存在逆矩陣?首先行列式為0调塌,自然就牽扯出來非滿秩牍氛,特征值只和為0。而對于近似奇異矩陣烟阐,他的行列式很接近于0搬俊,所以是一個很大的數(shù)字紊扬,根據(jù)求逆矩陣的公式,逆矩陣是可以通過伴隨矩陣和行列式求的唉擂,所以自然差別就很大了餐屎,所以病態(tài)矩陣也就是近似于奇異矩陣的矩陣了。那么知道原因了玩祟,我們要做的就是遠(yuǎn)離奇異矩陣腹缩。而事實(shí)上,ridge regression的結(jié)果:
加上一個對角線的值其實(shí)就是遠(yuǎn)離奇異矩陣空扎。
最后再看一個圖:
summary
加入正則項(xiàng)是為了避免過擬合,或解進(jìn)行某種約束,需要解保持某種特性
①L1正則可以保證模型的稀疏性影涉,也就是某些參數(shù)等于0,L1正則化是L0正則化的最優(yōu)凸近似,比L0容易求解规伐,并且也可以實(shí)現(xiàn)稀疏的效果,
②L2正則可以保證模型的穩(wěn)定性蟹倾,也就是參數(shù)的值不會太大或太小.L2范數(shù)是各參數(shù)的平方和再求平方根,我們讓L2范數(shù)的正則項(xiàng)最小猖闪,可以使W的每個元素都很小鲜棠,都接近于0。但與L1范數(shù)不一樣的是萧朝,它不會是每個元素為0岔留,而只是接近于0。越小的參數(shù)說明模型越簡單检柬,越簡單的模型越不容易產(chǎn)生過擬合現(xiàn)象献联。
③在實(shí)際使用中,如果特征是高維稀疏的何址,則使用L1正則里逆;如果特征是低維稠密的,則使用L2正則用爪。
④L2不能控制feature的“個數(shù)”原押,但是能防止模型overfit到某個feature上;相反L1是控制feature“個數(shù)”的偎血,并且鼓勵模型在少量幾個feature上有較大的權(quán)重诸衔。
總結(jié)一下之前學(xué)過的盯漂,第十八篇博客VC dimension是機(jī)器學(xué)習(xí)的理論保證:
霍夫丁不等式保證了一個hypothesis發(fā)生壞事的概率是很小的,Multi霍夫丁不等式保證了這個hypothesis set對于所有的數(shù)據(jù)集發(fā)生的壞事的概率滿足的不等式笨农,VC dimension則保證了這個hypothesis set里面發(fā)生的壞事的概率是很小的就缆,這就保證了泛化能力:Ein ≈ Eout。
之后介紹了三種線性模型(PLA比較簡單谒亦,不會再講了):
而對于這三種模型竭宰,我們又給出了三種工具:
Feature Transform:通過低維不可線性可分轉(zhuǎn)換到高維線性可分來解決Nonlinear的情況。
Regularization:通過增加正則化懲罰項(xiàng)來解決過擬合的問題份招。
Validation:用于對模型參數(shù)的選擇切揭,第一次選擇:是選擇上面模型。第二次選擇就是對模型參數(shù)的選擇了锁摔,這就用Validation來帥選廓旬。
最后是三個比較常用的錦囊妙計(jì):
⑥logistics regression代碼實(shí)現(xiàn)
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
def predict(w, x):
h = x * w
h = sigmoid(h)
if h > 0.5:
return int(1)
else:
return int(0)
def sigmoid(x):
return np.longfloat(1.0/(1+np.exp(-x)))
def error_rate(h, label):
m = np.shape(h)[0]
sum_err = 0.0
for i in range(m):
if h[i, 0] > 0 and (1-h[i, 0]) > 0:
sum_err += (label[i, 0] * np.log(h[i, 0]) + (1-label[i, 0])*np.log(1-h[i, 0]))
else:
sum_err += 0
return sum_err/m
def lr_train_bgd(feature, label, maxCycle, alpha, df):
n = np.shape(feature)[1]
m = np.shape(feature)[0]
w = np.mat(np.random.rand(n,1))
i = 0
while True:
i += 1
h = sigmoid(feature * w)
err = label - h
if i % 100== 0:
print('error : ', error_rate(h, label))
d = 0
scores = []
for i in range(m):
score = predict(w, feature[i])
scores.append(score)
if score == label[i]:
d += 1
print('train accuracy : ', (d/m)*100, '%')
if (d/m)*100 >= 90:
for i in range(m):
if df.iloc[i, 2] == 1:
c = 'red'
else:
c = 'blue'
plt.scatter(df.iloc[i, 0], df.iloc[i, 1], c=c)
x = [i for i in range(0, 10)]
plt.plot(np.mat(x).T, np.mat((-w[0]-w[1]*x)/w[2]).T, c = 'blue')
plt.show()
return
w += alpha * feature.T * err
def loadData(filename):
df = pd.read_csv(filename, sep=' ', names=['a', 'b', 'label'])
n, m = df.shape
features = []
labels = []
for i in range(n):
feature = []
feature.append(int(1))
for j in range(1,m):
feature.append(df.iloc[i, j])
if df.iloc[i, m-1] == -1:
labels.append(0)
else:
labels.append(1)
features.append(feature)
for i in range(n):
if df.iloc[i, 2] == 1:
c = 'red'
else:
c = 'blue'
plt.scatter(df.iloc[i, 0], df.iloc[i, 1], c = c)
plt.show()
return np.mat(features), np.mat(labels).T, df
if __name__ == '__main__':
f, t, df = loadData('../Data/testSet.txt')
lr_train_bgd(f, t, 10000, 0.001, df)
Github代碼:https://github.com/GreenArrow2017/MachineLearning/tree/master/MachineLearning/Linear%20Model/LogosticRegression