復現經典 《統計學習方法》第 2 章 感知機

2021-10-02 01:56:20 字數 4404 閱讀 6802

本文是李航老師的《統計學習方法》[1]一書的**復現。

**目錄

**參考:wzyonggege[4],wendesi[5],火燙火燙的[6]

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.target

df.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])

# 資料線性可分,二分類資料

# 此處為一元一次線性方程

class model:

def __init__(self):

self.w = np.ones(len(data[0]) - 1, dtype=np.float32)

self.b = 0

self.l_rate = 0.1

# self.data = data

def sign(self, x, w, b):

y = np.dot(x, w) + b

return y

# 隨機梯度下降法

def fit(self, x_train, y_train):

is_wrong = false

while not is_wrong:

wrong_count = 0

for 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 * y

wrong_count += 1

if wrong_count == 0:

is_wrong = true

return '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()

from sklearn.linear_model import perceptron

clf = 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] 《統計學習方法》: 統計學習方法/10430179

[2] 黃海廣: 

[3] github: /lihang-code

[4] wzyonggege: 

[5] wendesi: 

[6] 火燙火燙的: 

關於本站

往期精彩回顧

那些年做的學術公益-你不是乙個人在戰鬥

《統計學習方法》的python**實現(github標星7200+)

復現經典 《統計學習方法》第13章 無監督學習概論

1.機器學習或統計學習一般包括監督學習 無監督學習 強化學習。無監督學習是指從無標註資料中學習模型的機器學習問題。無標註資料是自然得到的資料,模型表示資料的類別 轉換或概率無監督學習的本質是學習資料中的統計規律或潛在結構,主要包括聚類 降維 概率估計。2.無監督學習可以用於對已有資料的分析,也可以用...

統計學習方法 第2章 感知機

2019 june 29 感知機輸入空間 mathcal subseteq mathbf 輸出空間 mathcal 決策函式 f x operatorname w cdot x b operatorname x left end right.frac 歸一化超平面法向量,令其等於 1。原始形式 輸入...

統計學習方法(第2章)感知機 學習筆記

感知機是二類分類的線性分類模型,其輸入為例項的特徵向量,感知機對應於輸入空間 特徵空間 中將例項劃分為正負兩類的分離超平面,屬於判別模型。匯入基於誤分類的損失函式,利用梯度下降法對損失函式進行極小化,求得感知機模型。感知機學習演算法分為原始形式和對偶形式,是神經網路和支援向量機的基礎。感知機定義 假...