2. 感知機(Perceptron)基本形式和對偶形式實現


1. 感知機原理(Perceptron)

2. 感知機(Perceptron)基本形式和對偶形式實現

3. 支持向量機(SVM)拉格朗日對偶性(KKT)

4. 支持向量機(SVM)原理

5. 支持向量機(SVM)軟間隔

6. 支持向量機(SVM)核函數

1. 前言

今天終於能把感知機的實現補上了,感知機的原理在1. 感知機原理(Perceptron)中已經詳盡的介紹,今天就是對感知機的兩種實現方式,進行講解。

2. 感知機實現

2.1 原始形式算法

假設讀者們已經了解了感知機的原始形式的原理(不熟悉的請看1. 感知機原理(Perceptron)原始形式),下面是原始形式的步驟,方便對照后面的代碼。

原始形式的步驟:

輸入:訓練數據集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}\)\(y_i\in{\{-1,+1\}}\),學習率\(\eta(0<\eta<1)\)

輸出:\(w,b\);感知機模型\(f(x)=sign(w\cdot {x}+b)\)

  1. 賦初值 \(w_0,b_0\)
  2. 選取數據點\((x_i,y_i)\)
  3. 判斷該數據點是否為當前模型的誤分類點,即判斷若\(y_i(w\cdot {x_i}+b)<=0\)則更新

\[w={w+\eta{y_ix_i}} \]

\[b={b+\eta{y_i}} \]

  1. 轉到2,直到訓練集中沒有誤分類點

主要實現代碼GitHub

def fit(self, X, y):
    # 初始化參數w,b
    self.w = np.zeros(X.shape[1])
    self.b = 0
    # 記錄所有error
    self.errors_ = []
    for _ in range(self.n_iter):
        errors = 0
        for xi, yi in zip(X, y):
            update = self.eta * (yi - self.predict(xi))
            self.w += update * xi
            self.b += update
            errors += int(update != 0.0)
        if errors == 0:
            break
        self.errors_.append(errors)

    return self

2.2 對偶形式算法

假設讀者們已經了解了感知機的對偶形式的原理(不熟悉的請看1. 感知機原理(Perceptron)對偶形式),下面是對偶形式的步驟,方便對照后面的代碼。

對偶形式的步驟:

由於\(w,b\)的梯度更新公式:

\[w={w+\eta{y_ix_i}} \]

\[b={b+\eta{y_i}} \]

我們的\(w,b\)經過了\(n\)次修改后的,參數可以變化為下公式,其中\(\alpha = ny\)

\[w=\sum_{x_i\in{M}}\eta{y_ix_i}=\sum_{i=1}^n\alpha_iy_ix_i \]

\[b=\sum_{x_i\in{M}}\eta{y_i}=\sum_{i=1}^n\alpha_iy_i \]

這樣我們就得出了感知機的對偶算法。

輸入:訓練數據集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}\)\(y_i\in{\{-1,+1\}}\),學習率\(\eta(0<\eta<1)\)

輸出:\(\alpha,b\);感知機模型\(f(x)=sign(\sum_{j=1}^n\alpha_jy_jx_j\cdot {x}+b)\)

其中\(\alpha=(\alpha_1,\alpha_2,...,\alpha_n)^T\)

  1. 賦初值 \(\alpha_0,b_0\)
  2. 選取數據點\((x_i,y_i)\)
  3. 判斷該數據點是否為當前模型的誤分類點,即判斷若\(y_i(\sum_{j=1}^n\alpha_jy_jx_j\cdot {x_i}+b)<=0\)則更新

\[\alpha_i={\alpha_i+\eta} \]

\[b={b+\eta{y_i}} \]

  1. 轉到2,直到訓練集中沒有誤分類點

為了減少計算量,我們可以預先計算式中的內積,得到Gram矩陣

\[G=[x_i,x_j]_{N×N} \]

主要實現代碼GitHub

def fit(self, X, y):
    """
    對偶形態的感知機
    由於對偶形式中訓練實例僅以內積的形式出現
    因此,若事先求出Gram Matrix,能大大減少計算量
    """
    # 讀取數據集中含有的樣本數,特征向量數
    n_samples, n_features = X.shape
    self.alpha, self.b = [0] * n_samples, 0
    self.w = np.zeros(n_features)
    # 計算Gram_Matrix
    self.calculate_g_matrix(X)

    i = 0
    while i < n_samples:
        if self.judge(X, y, i) <= 0:
            self.alpha[i] += self.eta
            self.b += self.eta * y[i]
            i = 0
        else:
            i += 1

    for j in range(n_samples):
        self.w += self.alpha[j] * X[j] * y[j]

    return self

3. 小結

感知機算法是一個簡單易懂的算法,自己編程實現也不太難。前面提到它是很多算法的鼻祖,比如支持向量機算法,神經網絡與深度學習。因此雖然它現在已經不是一個在實踐中廣泛運用的算法,還是值得好好的去研究一下。感知機算法對偶形式為什么在實際運用中比原始形式快,也值得好好去體會。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM