回到本系列的第一篇文章機器學習從入門到放棄之KNN算法,在裏面有這樣的一個問題git
黃點表明1類電影的分佈,綠色表明0類電影的分佈,紫色表明須要分類的電影樣本。
那麼該怎麼判別紫色的那顆點所在的類別呢?程序員
以前給出的是KNN算法,經過計算紫色點都周邊的劇場的長短,來判斷紫色點屬於哪一個類別。如今有這樣一種極端狀況,黃點和綠點在紫點周圍呈圓周分佈,距離同樣,咋辦?github
圖畫得不是太好,你們理會個人意思就行。算法
在這種狀況,假如像下圖這樣的狀況,就容易處理得多了。segmentfault
紅線的下方是黃色種類,上方時綠色種類。微信
這種狀況咱們稱之爲線性分類,關於如何擬合出這條線程函數下面會講述。如今先來講說,既然這叫線性分類,那麼必然會有非線性的狀況啊,那咋辦呢?機器學習
沒錯,若是特徵能夠被線性函數所有表達,這天然是理想狀況,但實際問題中更多的非線性分類。
這時,咱們須要將線性函數
轉換爲非線性函數
。那怎麼轉換呢,很簡單,將線性函數(假設叫z),扔到某一非線性函數f(x)
內,獲得新的表達式y = f(z)
,就是咱們所需的非線性分類器
了,而f(x)
也就做激活函數,它有不少種,本文只介紹邏輯迴歸所使用到的sigmoid函數,其表達式是函數
其圖像有一個漂亮的S型學習
可見在x的取值範圍足夠大的時候,其從0變1的過程能夠忽略不計,所以,咱們習慣的把>0.5
歸爲1
類,<0.5
歸爲0
類,那麼剛好是0.5
怎麼辦?這個機率是極低的,若是真的是0.5
,那就隨機歸類,而後出門買張彩票吧,說不定就不用繼續當程序員了。 (/≥▽≤/)spa
上面函數圖像引用雲深不知處的博客
回到表達式上,可知函數的變量是z
其他都是常量,所要要求解該分類函數的值,就是要肯定z的值而z
是線性方程,基本的數學知識不難知道,
$$z=a1x1+a2x2……an*xn$$
其中[x1……xn]
是輸入向量,因此訓練的過程就是肯定於[a1,a2……an]
的值,使得該表達式對於多個輸入向量的輸出值正確率最高。
下面開始講述求最佳的[a1,a2……an]
的方法
顯然,咱們能夠設計一個函數來衡量[a1,a2……an]
是否最佳,好比說這樣的
$$J(a) = sum_{n=0}(f_a(xi)-y)^2$$
顯然當J(a)達到最小值時,a的值最佳。方法以下,
初始化weight,可使用隨機值
代入式子獲得err = y - predict
weight = weight + alpha * error * x_train[i]
,其中alpha稱爲學習速率,過小會影響函數的收斂速度,太大剛纔就不收斂了。
爲了解決上述問題,在《機器學習實戰中》使用了動態更新alpha的方法,式子爲alpha = 4/(1+i)+0.01
上述修改weight
的過程稱爲梯度降低法
,其中我故意略去了數學證實部分,須要的同窗請自行查找專業資料。
文章描述若有錯誤,歡迎指正。
個人我的公衆號開啓啦,微信公衆號搜索肥兔子的碎碎語
,你能查看到更多學習心得的分享噢⊙ω⊙。