一、感知機模型
在乙個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寫的 和一些自己再看書時的小小的理解。感知機是一種二類分類的線性模型模型,是乙個將輸入空間 特徵空間 分成正負兩類的分離超平面。它的更多...