《統計學習方法》學習之一 感知機

2021-08-19 18:53:01 字數 4858 閱讀 3516

一、感知機模型

在乙個n維空間中,存在乙個超平面,可以將特徵向量分為+1和-1兩個類別。(具體內容可以參考李航《統計學習方法》一書)。

二、**實現

import numpy as np

defperceptron_algorithm_01

(x_input, y_input, lr=1.0, weight_init='zeros', bias_init='zeros', max_iteration=1000):

''' :param x_input:輸入的特徵向量,x∈r^n。

:param y_input: ,欸乙個特徵向量對應的類別,y∈。

:param lr: 學習率,預設為1.0。

:param weight_init: 權重初始化方法,是['zeros', 'ones', 'random']三個中的乙個。

:param bias_init: 偏置初始化方法,是['zeros', 'ones', 'random']三個中的乙個。

:param max_iteration: 最大迭代次數,預設為1000。

:return: 權重weight和偏置bias

'''assert len(x_input) == len(y_input)

if weight_init not

in ['zeros', 'ones', 'random']:

raise valueerror("""please choose weight_init parameter correctly!\n

weight_init: one of these choices:'zeros', 'ones', 'random'""")

if bias_init not

in ['zeros', 'ones', 'random']:

raise valueerror("""please choose bias_init parameter correctly!\n

bias_init: one of these choices:'zeros', 'ones', 'random'""")

x_input = np.array(x_input)

y_input = np.array(y_input)

if weight_init == 'zeros':

weight = np.zeros(shape=[x_input.shape[1]])

elif weight_init == 'ones':

weight = np.ones(shape=[x_input.shape[1]])

elif weight_init == 'random':

weight = np.random.random(size=(x_input.shape[1]))

if bias_init == 'zeros':

bias = 0

elif bias_init == 'ones':

bias = 1

elif bias_init == 'random':

bias = np.random.random()

iteration = 0

while

true:

x, y = none, none

for i, j in zip(x_input, y_input):

if j * (sum(weight * i) + bias) <= 0:

x = i

y = j

break

if x is

notnone

and y is

notnone

and iteration < max_iteration:

weight += lr * y * x

bias += lr * y

iteration += 1

else:

break

return weight, bias

defperceptron_algorithm_02

(x_input, y_input, lr=1.0, alpha_init='zeros', bias_init='zeros', max_iteration=1000):

''' :param x_input:輸入的特徵向量,x∈r^n。

:param y_input: ,欸乙個特徵向量對應的類別,y∈。

:param lr: 學習率,預設為1.0。

:param alpha_init: 權重初始化方法,是['zeros', 'ones', 'random']三個中的乙個。

:param bias_init: 偏置初始化方法,是['zeros', 'ones', 'random']三個中的乙個。

:param max_iteration: 最大迭代次數,預設為1000。

:return: 權重weight和偏置bias

'''assert len(x_input) == len(y_input)

x_input = np.array(x_input)

y_input = np.array(y_input)

if alpha_init not

in ['zeros', 'ones', 'random']:

raise valueerror("""please choose alpha_init parameter correctly!\n

alpha_init: one of these choices:'zeros', 'ones', 'random'""")

if bias_init not

in ['zeros', 'ones', 'random']:

raise valueerror("""please choose bias_init parameter correctly!\n

bias_init: one of these choices:'zeros', 'ones', 'random'""")

if alpha_init == 'zeros':

alpha = np.zeros(shape=[x_input.shape[0]])

elif alpha_init == 'ones':

alpha = np.ones(shape=[x_input.shape[0]])

elif alpha_init == 'random':

alpha = np.random.random(size=(x_input.shape[0]))

if bias_init == 'zeros':

bias = 0

elif bias_init == 'ones':

bias = 1

elif bias_init == 'random':

bias = np.random.random()

gram_matrix = np.zeros(shape=[x_input.shape[0], x_input.shape[0]])

for i in range(x_input.shape[0]):

for j in range(i, x_input.shape[0]):

gram_matrix[i][j] = gram_matrix[j][i] = sum(x_input[i]*x_input[j])

iteration = 0

while

true:

pos = -1

for i in range(len(x_input)):

if y_input[i] * (sum(alpha[j] * y_input[j] * gram_matrix[i][j] for j in range(len(x_input))) + bias) <= 0:

pos = i

break

if pos != -1

and iteration < max_iteration:

alpha[pos] += lr

bias += lr * y_input[pos]

iteration += 1

else:

break

weight = np.sum((alpha[i] * y_input[i] * x_input[i] for i in range(len(x_input))), axis=0)

return weight, bias

if __name__ == '__main__':

x = [[3, 3], [4, 3], [1, 1]]

y = [1, 1, -1]

w, b = perceptron_algorithm_01(x, y, lr=1.0, weight_init='zeros', bias_init='zeros')

print('感知機學習演算法的原始形式:')

print('所得權重:', w)

print('所得偏置:', b)

w, b = perceptron_algorithm_02(x, y, lr=1.0, alpha_init='zeros', bias_init='zeros')

print('感知機學習演算法的對偶形式:')

print('所得權重:', w)

print('所得偏置:', b)

結果如下:

感知機學習演算法的原始形式:

所得權重: [1. 1.]

所得偏置: -3

.0感知機學習演算法的對偶形式:

所得權重: [1. 1.]

所得偏置: -3

.0

三、結論

感知機是一種極為簡單的機器學習模型,對初始值敏感,在實際中較少用到。

感知機 統計學習方法

一 感知機適用問題以及它的輸入,輸出,求解方法 1 感知機 perceptron 適用於二類分類問題 該分類問題是線性可分問題 2 感知機模型是線性分類模型 3 感知機的幾何解釋,感知機對應的是乙個超平面 4 輸入 例項的特徵向量 5 輸出 例項的類別,取 1和 1二值 6 求解方法 有監督學習 給...

《統計學習方法》 感知機

最近終於有開始看 統計學習方法 了,畢竟無腦調參確實沒有什麼意義。一方面是作為看書的筆記,一方面作為比部落格或許能起到一點參考作用吧。希望可以日更。由輸入空間到輸出空間的函式 f x si gn w x b f x sign w cdot x b f x s ign w x b 稱為感知機。感知機是...

統計學習方法之感知機

在翻閱知乎時,得知李航所著的 統計學習方法 一書,於是就買了一本,看到csdn上已有大牛都發了相關的部落格,再次贅述就顯得囉嗦了,就直接上乾貨吧,自己用matlab寫的 和一些自己再看書時的小小的理解。感知機是一種二類分類的線性模型模型,是乙個將輸入空間 特徵空間 分成正負兩類的分離超平面。它的更多...