1. 程式人生 > >演算法工程師修仙之路:吳恩達機器學習(四)

演算法工程師修仙之路:吳恩達機器學習(四)

吳恩達機器學習筆記及作業程式碼實現中文版

第四章 Logistic迴歸


分類

  • 在分類問題中,要預測的變數y是離散的值,邏輯迴歸 (Logistic Regression) 演算法是目前最流行使用最廣泛的一種學習演算法。

  • 在分類問題中,我們嘗試預測的是結果是否屬於某一個類

    • 正確或錯誤。
    • 判斷一封電子郵件是否是垃圾郵件。
    • 判斷一次金融交易是否是欺詐。
    • 區別一個腫瘤是惡性的還是良性的。
  • 我們將因變數(dependent variable)可能屬於的兩個類分別稱為負向類(negative class)和正向類( positive class),則因變數 y只取0或1,其中 0 表示負向類,1 表示正向類。

假設陳述

  • 根據線性迴歸模型我們只能預測連續的值,然而對於分類問題,我們需要輸出 0 或 1,我們可以預測:

    • h θ ( x )
      > = 0.5 ℎ_\theta(x) >= 0.5
      時,預測y=1。
    • h
      θ ( x ) < 0.5 ℎ_\theta(x) < 0.5
      時,預測y=0。
  • 邏輯迴歸模型的假設是: h θ ( x ) = g ( θ T X ) ℎ_\theta(x) = g(\theta^TX)

    • 邏輯迴歸模型的輸出變數範圍始終在 0 和 1 之間。
    • X代表特徵向量。
    • g代表邏輯函式(logistic function)。
    • 一個常用的邏輯函式為 S 形函式(Sigmoid function)。
    • 公式為 g ( z ) = 1 1 + e z g(z)=\frac{1}{1+e^{-z}}
      import numpy as np
      def sigmoid(z):
          return 1 / (1 + np.exp(-z))
      
    • h θ ( x ) ℎ_\theta(x) 的作用是,對於給定的輸入變數,根據選擇的引數計算輸出變數為1的可能性(estimated probablity)即 h θ ( x ) = P ( y = 1 x ; θ ) ℎ_\theta(x) = P(y=1|x; \theta)。

決策界限

  • 在邏輯迴歸中,我們預測:

    • h θ ( x ) > = 0.5 ℎ_\theta(x) >= 0.5 時,預測y=1。
    • h θ ( x ) < 0.5 ℎ_\theta(x) < 0.5 時,預測y=0。
      在這裡插入圖片描述
  • 根據S 形函式影象,我們知道:

    • 當z=0時,g(z)=0.5。
    • 當z>0時,g(z)>0.5。
    • 當z<0時,g(z)<0.5。
  • z = θ T x z=\theta^Tx ,即:

    • z = θ T x &gt; = 0 z=\theta^Tx&gt;= 0 時,預測y=1。
    • z = θ T x &lt; 0 z=\theta^Tx&lt; 0 時,預測y=0。
  • 我們可以用非常複雜的模型來適應非常複雜形狀的判定邊界。

代價函式

  • 對於線性迴歸模型,我們定義的代價函式是所有模型誤差的平方和。理論上來說,我們也可以對邏輯迴歸模型沿用這個定義,但是問題在於,當我們將 h θ ( x ) = 1 1 + e θ T ( x ) h_\theta(x)=\frac{1}{1+e^{-\theta^T(x)}} 帶入到這樣定義了的代價函式中時,我們得到的代價函式將是一個非凸函式( non-convexfunction)。這意味著我們的代價函式有許多區域性最小值,這將影響梯度下降演算法尋找全域性最小值。

  • 我們重新定義邏輯迴歸的代價函式為:

    • J ( θ 0 , θ 1 , . . . , θ n ) = 1 m i = 1 m C o s t ( h θ ( x ( i ) ) , y ( i ) ) J(\theta_0, \theta_1, ..., \theta_n)=\frac{1}{m}\sum_{i=1}^mCost(h_\theta(x^{(i)}), y^{(i)})
    • C o s t ( h θ ( x ( i ) ) , y ( i ) ) = y ( i ) l o g ( h θ ( x ( i ) ) ) ( 1 y ( i ) ) l o g ( 1 h θ ( x ( i ) ) ) Cost(h_\theta(x^{(i)}), y^{(i)})=−y^{(i)}log(h_\theta(x^{(i)})) − (1 − y^{(i)}) log(1-h_\theta(x^{(i)}))
  • 這樣構建的函式的特點是:

    • 當實際的y=1且 h θ ( x ) h_\theta(x) 也為1時誤差為 0。

    • 當y=1但 h θ ( x ) h_\theta(x) 不為 1 時誤差隨著 h θ ( x ) h_\theta(x) 變小而變大。

    • 當實際的y=0且 h θ ( x ) h_\theta(x) 也為 0 時代價為 0。

    • 當y=0但 h θ ( x ) h_\theta(x) 不為 0 時誤差隨著 h θ ( x ) h_\theta(x) 的變大而變大。

    • 代價函式 J ( θ ) J(\theta) 會是一個凸函式,並且沒有區域性最優值。

      import numpy as np
      def cost(theta, X, y):
          theta = np.matrix(theta)
          X = np.matrix(X)
          y = np.matrix(y)
          first = np.multiply(-y, np.log(sigmoid(X* theta.T)))
          second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T)))
          return np.sum(first - second) / (len(X))
      
  • 在得到這樣一個代價函式以後,我們便可以用梯度下降演算法來求得能使代價函式最小的引數了。

  • 邏輯迴歸的梯度下降演算法推導:

    • J ( θ 0 , θ 1 , . . . , θ n ) = 1 m i = 1 m [ y ( i ) l o g ( h θ ( x ( i ) ) ) + ( 1 y ( i ) ) l o g ( 1 h θ ( x ( i ) ) ) ] J(\theta_0, \theta_1, ..., \theta_n)=-\frac{1}{m}\sum_{i=1}^m[y^{(i)}log(h_\theta(x^{(i)})) + (1−y^{(i)}) log(1-h_\theta(x^{(i)}))]