1.感知机学习算法的原始形式
- 输入:训练数据集T={(x1,y1),(x2,y2),...,(xn,yn)},其中xi属于R,yi属于{+1,-1},i=1,2,...,n;学习率h(0<h=<1)
-
输出:w,b;感知机模型f(x)=sign(w*x+b)
- 1、选取初值w0,b0;
- 2、在训练数据集中选取数据(xi,yi):
- 3、如果yi(w*xi+b)<=0:
w <-- w + h*yi*xi b <-- b + h*yi
- 4、转至-2,直至训练集中没有误分类点
python实现感知机模型原始形式:
def perceptron_model(train_datas, train_labels, h, iters=100):
# 1.初始化权值参数w0 和偏置b0
w = np.array([0., 0.])
b = 0.
for iter_ in range(iters):
for x,y in zip(train_datas, train_labels):
if y*(np.dot(w, x)+b)<=0:
w=w+h*y*x
b=b+h*y
print('w:', w)
print('b:', b)
return w, b
def sk_percetron_model(train_datas, train_labels):
model = Perceptron(n_iter = 40, eta0 = 0.01, random_state = 1)
model.fit(train_datas, train_labels)
#得到训练结果,权重矩阵
print('w',model.coef_)
#超平面的截距
print('b',model.intercept_)
return model.coef_, model.intercept_
train_data = [[3, 3], [4, 3], [1, 1]]
train_label = [1, 1, -1]
train_datas = np.array(train_data)
train_labels = np.array(train_label)
w, b = perceptron_model(train_datas, train_labels, 0.001)
w_, b_ = sk_percetron_model(train_datas, train_labels)
plot_model(w_[0], b_, train_datas, train_labels)
plot_model(w, b, train_datas, train_labels)
w: [0.001 0.001]
b: -0.003
w [[0.01 0.01]]
b [-0.03]
感知机模型的假设空间为:函数集合—{f|f(x)=wx+b}
模型的复杂度主要体现在模型参数w上,而w的规模取决于输入数据特征的数量,故模型的复杂度间接体现在输入特征的数量上。如果是多层感知机,还取决于感知机的层数,这个时候就要考虑模型的结构风险,防止过拟合的现象出现,尽可能加入正则化。