上一部分我介绍了机器学习的基本知识,这一节我将介绍感知器 Perceptron。 感知器主要应用在神经网络中,是一个简单的二元线性分类器
从零开始学习机器学习(一)线性分类器(linear classifier) 监督学习 无监督学习 损失函数 梯度下降 随机梯度下降(SGD)_UnicornH!XD的博客-优快云博客
感知机 Perceptron
一个加上权重 以偏项bias term及的线性函数:
感知器是一个二元分类器:
预测任务就是给定输入和权重
计算预测的
。 学习任务的目标是给定训练数据
来寻找合适的
。在感知机模型中,权重
对应的向量是决策边界,用来将两个类分离开。
关于数据的生成过程如下:
(1)计算
(2)如果 , 呢么
; 否则
接下来需要构建loss function:
如果预测的 是正确的,呢么
否则
由此,loss function就是:
是误分类的样本集合
通过SGD优化参数
这里是估计的梯度,即:
求导后,我们得到:
进一步的,参数通过下列公式更新:
决策边界 Decision Boundary
决策边界指的是一个硬阈值,它将我们的输入空间划分为那些应该在一个类或另一个类中考虑的样本。在感知机中,决策边界通常定义为:
对于两个输入:
这是一条直线,因为决策边界通常都是线性的。
总结
在这一部分,我介绍了
(1)感知机算法
(2)数据的生成
(3)通过SGD最优化
(4)决策边界
下一部分,我将介绍逻辑回归 Logistic Regression模型 https://blog.youkuaiyun.com/qq_42715079/article/details/120981411
最后附带代码:
#define prediction function
def predict_fn(x1, x2, w0, w1, w2):
y_pre = np.sign(w1*x1 + w2*x2 + w0)
return y_hat
#def loss function
def loss_fn(x1, x2, y, w0, w1, w2):
y_pre = predict_fn(x1, x2, w0, w1, w2)
loss = -np.sum(y*y_pre*(y != y_pre)
return loss
#def update function
def update_fn(x1, x2, y, y_pre, w0, w1, w2):
if ((y == 1) & (y_pre == -1)):
w0 = w0 + 1
w1 = w1 + x1
w2 = w2 + x2
if ((y == -1) & (y_pre == 1)):
w0 = w0 - 1
w1 = w1 - x1
w2 = w2 - x2
return w0, w1, w2
#set the parameters
n_epochs = 5000 #interation times
w0_hat = 0
w1_hat = -0.5
w2_hat = 1.5
#store
loss_vec = np.zeros(n_epochs)
w0_vec = np.zeros(n_epochs)
w1_vec = np.zeros(n_epochs)
w2_vec = np.zeros(n_epochs)
#interaction
for epoch in range(n_epochs):
#sample one of the training point
i = random.randint(0, n-1)
y_i = y[i]
x1_i = x1[i]
x2_i = x2[i]
#predict
y_pre_i = predcit_fn(x1_i, x2_i, w0_hat, w1_hat, w2_hat)
#update
w0_hat, w1_hat, w2_hat = update_fn(x1_i, x2_i, y_i, y_pre_i, w0_hat, w1_hat, w2_hat)
#loss
loss = loss.fn(x1_i, x2_i, y, w0_hat, w1_hat, w2_hat)
#store
loss_vec[epoch] = loss
w0_vec[epoch] = w0_hat
w1_vec[epoch] = w1_hat
w2_vec[epoch] = w2_hat
#plot the scatter
plt.scatter(np.arange(0, n_epochs), loss_vec, s = 16)
plt.xlabel("Epoch")
plt.ylabel("Loss")