一、感知机
感知机是二分类的线性分类模型,就我的理解是,找到类似于“线性回归”的一个超平面,将所有实例划分为两类,利用梯度下降优化算法,尽量使得误分类点越少,误分类点离超平面越近,损失数值就越小。
1.1 感知机模型
其中 s i g n sign sign符号函数,即
感知机模型可以先将 w ∗ x + b w*x+b w∗x+b看作线性模型,其中w为权值向量,b为偏置。然后将线性模型输出的结果代入 s i g n sign sign符号函数中,输出对应的类别。
1.2 学习策略
损失函数:误分类点到超平面( w x + b = 0 wx+b=0 wx+b=0)的总距离。
那么任意一点到超平面的距离为:
其中 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣为 w w w的 l 2 l_2 l2范数。
由于,对于误分类点来说:
因此,任意误分类点到超平面的距离为:
那么,所有误分类点到超平面的总距离为:
这里我们不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1,所以得到了我们需要的损失函数:
所以我们需要使得损失函数最小,使用梯度下降得到模型需要的最优参数。
二、感知机原始模式
梯度下降的细节就不多说了,这里我们需要使得模型的损失函数值最小,从而得到模型参数"w,b",那么只需要对损失函数公式对应求偏导,然后根据梯度下降和下面的算法求得模型的最优参数。
2.1 原始模式算法实现
# 感知机算法实现
import numpy as np
import time
# 定义时间装饰器
def timmer(func):
def wrapper(*args,**kwargs):
start_time = time.time()
res = func(*args, **kwargs)
stop_time = time.time()
print('Func %s,run time :%s' %(func.__name__,stop_time-start_time))
return res
return wrapper
class Perceptron:
def __init__(self):
self.weights=None
self.bias=None
def sign(self,value):
return 1 if value>=0 else -1
@timmer
def train(self,dataSet,labels,iter=50):
# 学习率
lr=0.9
dataSet = np.array(dataSet)
n,m = np.shape(dataSet)
# 初始化参数
w = np.zeros(m)
b=0
# 迭代
for k in range(iter):
print("Round{0}:{1}".format(k,iter))
# 使用随机梯度下降
for i in range(n):
if (-labels[i]*self.sign(np.dot(w,dataSet[i])+b)>=0):
w=w+lr*labels[i]*dataSet[i]
b=b+lr*labels[i]
self.weights=w
self.bias=b
def predict(self, data):
if (self.weights is not None and self.bias is not None):
return self.sign(np.dot(self.weights, data) + self.bias)
else:
return 0
if __name__ == '__main__':
data_set = [[3, 3],
[4, 3],
[1, 1]]
labels = [1, 1, -1]
perceptron = Perceptron()
perceptron.train(data_set, labels,30)
print("weights is:", perceptron.weights)
print("bias is:", perceptron.bias)
result = perceptron.predict([3, 3])
print("prediction:", result)