文章目录
1.概述
2.损失函数定义
3.算法
4.代码实现
概述
感知机(perceptron)
感知机算法可以说是最简单的二分类模型了,属于有监督学习。
模型的输入是 ,其输入为实例的特征向量,对输入样本的假设是线性可分的,即存在一个超平面可以将所有样本点分成两类,其输入为实例的特征向量,输出为实例的类别,取+1、-1。利用数学语言抽象模型可以这样描述:
感知机模型
感知机学习的目标就是找到这样的一组参数 w 和 b 使得将数据的样本点全部正确分开。
损失函数的定义
符号规定
数据集
输入
输出
任一输入样本到超平面S的距离:
对于错误分类样本来说到超平面距离为
假设所有分类错误样本集合M,所有分类错误样本到超平面S的总面积为
不考虑,就得到感知机模型的loss function:
M是错误分类点的集合
算法
原始形式
有了损失函数,我们就要对感知机模型转化为求损失函数的最优化问题,使loss function最小,具体采用随机梯度下降(SGD),用梯度下降法不断迭代使得w和b一步步优化loss function。
(1)首先随机选择初值w0,b0。
(2)选取训练集中的一个数据()
(3)对于每一个错误分类的点,更新其权重:
(4)回到第2步,直到达到一定次数或者全部分类正确为止
代码实现
class _Perceptron():
def __init__(self,learning_rate = 1):
self.learning_rate = learning_rate
self.w = None
self.b = 0
def fit(self,x,y):
n = 0
self.w = np.zeros(len(x[0]))
while True:
n += 1
count = 0
for i in range(len(x)):
if y[i]*(np.dot(self.w,x[i]) + self.b) <= 0 :
count += 1
print('w:',self.w,' b:',self.b)
self.w = self.w + self.learning_rate * y[i] * x[i]
self.b = self.b + self.learning_rate * y[i]
if count == 0 or n == 1000:
print("收敛")
print('迭代次数: ',n)
break
def predict(self,x):
y = np.zeros(len(x))
for i in range(len(x)):
if np.dot(self.w ,x[i]) + self.b > 0:
y[i] = 1
else :
y[i] = -1
return y
if __name__ == 'main':
x = np.array([[3,3],[4,3],[1,1]])
y = np.array([1,1,-1])
model = _Perceptron(learning_rate=0.1)
model.fit(x,y)
model.predict([[1,0]])
结果如下
image.png