复现经典:《统计学习方法》第 2 章 感知机
本文是李航老師的《統計學習方法》[1]一書的代碼復現。
作者:黃海廣[2]
備注:代碼都可以在github[3]中下載。
我將陸續將代碼發布在公眾號“機器學習初學者”,敬請關注。
代碼目錄
- 第 1 章 統計學習方法概論 
- 第 2 章 感知機 
- 第 3 章 k 近鄰法 
- 第 4 章 樸素貝葉斯 
- 第 5 章 決策樹 
- 第 6 章 邏輯斯諦回歸 
- 第 7 章 支持向量機 
- 第 8 章 提升方法 
- 第 9 章 EM 算法及其推廣 
- 第 10 章 隱馬爾可夫模型 
- 第 11 章 條件隨機場 
- 第 12 章 監督學習方法總結 
代碼參考:wzyonggege[4],WenDesi[5],火燙火燙的[6]
第 2 章 感知機
1.感知機是根據輸入實例的特征向量對其進行二類分類的線性分類模型:
感知機模型對應于輸入空間(特征空間)中的分離超平面。
2.感知機學習的策略是極小化損失函數:
損失函數對應于誤分類點到分離超平面的總距離。
3.感知機學習算法是基于隨機梯度下降法的對損失函數的最優化算法,有原始形式和對偶形式。算法簡單且易于實現。原始形式中,首先任意選取一個超平面,然后用梯度下降法不斷極小化目標函數。在這個過程中一次隨機選取一個誤分類點使其梯度下降。
4.當訓練數據集線性可分時,感知機學習算法是收斂的。感知機算法在訓練數據集上的誤分類次數滿足不等式:
當訓練數據集線性可分時,感知機學習算法存在無窮多個解,其解由于不同的初值或不同的迭代順序而可能有所不同。
二分類模型
給定訓練集:
定義感知機的損失函數
算法
隨即梯度下降法 Stochastic Gradient Descent
隨機抽取一個誤分類點使其梯度下降。
當實例點被誤分類,即位于分離超平面的錯誤側,則調整,?的值,使分離超平面向該無分類點的一側移動,直至誤分類點被正確分類
拿出 iris 數據集中兩個分類的數據和[sepal length,sepal width]作為特征
import pandas as pd import numpy as np from sklearn.datasets import load_iris import matplotlib.pyplot as plt %matplotlib inline# load data iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df['label'] = iris.targetdf.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label' ] df.label.value_counts() 2 50 1 50 0 50 Name: label, dtype: int64 plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0') plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1') plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend() data = np.array(df.iloc[:100, [0, 1, -1]])X, y = data[:,:-1], data[:,-1]y = np.array([1 if i == 1 else -1 for i in y])Perceptron
# 數據線性可分,二分類數據 # 此處為一元一次線性方程 class Model:def __init__(self):self.w = np.ones(len(data[0]) - 1, dtype=np.float32)self.b = 0self.l_rate = 0.1# self.data = datadef sign(self, x, w, b):y = np.dot(x, w) + breturn y# 隨機梯度下降法def fit(self, X_train, y_train):is_wrong = Falsewhile not is_wrong:wrong_count = 0for d in range(len(X_train)):X = X_train[d]y = y_train[d]if y * self.sign(X, self.w, self.b) <= 0:self.w = self.w + self.l_rate * np.dot(y, X)self.b = self.b + self.l_rate * ywrong_count += 1if wrong_count == 0:is_wrong = Truereturn 'Perceptron Model!'def score(self):pass perceptron = Model() perceptron.fit(X, y) 'Perceptron Model!' x_points = np.linspace(4, 7, 10) y_ = -(perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1] plt.plot(x_points, y_)plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0') plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1') plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend()scikit-learn 實例
from sklearn.linear_model import Perceptronclf = Perceptron(fit_intercept=False, max_iter=1000, shuffle=False) clf.fit(X, y)Perceptron(alpha=0.0001, class_weight=None, early_stopping=False, eta0=1.0,fit_intercept=False, max_iter=1000, n_iter=None, n_iter_no_change=5,n_jobs=None, penalty=None, random_state=0, shuffle=False, tol=None,validation_fraction=0.1, verbose=0, warm_start=False) # Weights assigned to the features. print(clf.coef_)[[ 74.6 -127.2]] # 截距 Constants in decision function. print(clf.intercept_)[0.] x_ponits = np.arange(4, 8) y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1] plt.plot(x_ponits, y_)plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0') plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1') plt.xlabel('sepal length') plt.ylabel('sepal width') plt.legend() 參考資料[1] 《統計學習方法》:?https://baike.baidu.com/item/統計學習方法/10430179 [2] 黃海廣:?https://github.com/fengdu78 [3] github:?https://github.com/fengdu78/lihang-code [4] wzyonggege:?https://github.com/wzyonggege/statistical-learning-method [5] WenDesi:?https://github.com/WenDesi/lihang_book_algorithm [6] 火燙火燙的:?https://blog.csdn.net/tudaodiaozhale關于本站“機器學習初學者”公眾號由是黃海廣博士創建,黃博個人知乎粉絲23000+,github排名全球前100名(33000+)。本公眾號致力于人工智能方向的科普性文章,為初學者提供學習路線和基礎資料。原創作品有:吳恩達機器學習個人筆記、吳恩達深度學習筆記等。 往期精彩回顧 那些年做的學術公益-你不是一個人在戰斗 適合初學者入門人工智能的路線及資料下載 吳恩達機器學習課程筆記及資源(github標星12000+,提供百度云鏡像)吳恩達深度學習筆記及視頻等資源(github標星8500+,提供百度云鏡像) 《統計學習方法》的python代碼實現(github標星7200+) 機器學習的數學精華(在線閱讀版)備注:加入本站微信群或者qq群,請回復“加群”總結
以上是生活随笔為你收集整理的复现经典:《统计学习方法》第 2 章 感知机的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 复现经典:《统计学习方法》第 5 章 决
- 下一篇: 复现经典:《统计学习方法》第 3 章 k
