简单感知机(原始形式)模型的代码实现
感知机是二分类的线性分类模型,其输入是实例的特征向量,输出是实例的类别(取值+1和-1)
感知机是学习神经网络和支持向量机的基础,目前我还没发现感知机的库函数可以调用,这是其他一些机器学习模型的库函数调用的例子基于 Python 和 Scikit-Learn 的机器学习介绍
感知机模型; f(x)=sign (wx+b)
w是权值或叫权值向量,b叫偏置,wx表示w和x的內积,sign是符号函数,sign(x)=1或-1
通过顺势函数最小化求感知机模型,即所有误分类点到超平面S的总距离
以《统计学习方法》中的数据集为例验证代码,x1=(3,3),x2=(4,3),x3=(1,1);
y1=1,y2=1,y3=-1;
答案是w=[1. 1.],b=-3
import numpy as np
# 2018.10.16 原始形式的感知机算法
X = np.array([[3,3],[4,3],[1,1]]) # 实例的特征向量
y = np.array([1,1,-1]) # 实例的类别
Shape = X.shape
row = Shape[0] # 数据个数
col = Shape[1] # 特征向量个数
def perceptron(niter,w,b,eta):
while niter < N: # 循环迭代
i = 0
while i < row: # 遍历每个数据
dir = dirction(i,w,b) # 计算损失函数
if dir <= 0: # 更新条件
w = w+eta*X[i]*y[i]
b = b + eta * y[i] # 更新b
i = i + 1
niter = niter+1
return w,b
def dirction(index,w,b): #损失函数
result = y[index]*(sum(w*X[index])+b) # dir=y[index]*(w*X[index]+b)
return result
w = np.zeros(col) # 权值向量
b = 0 # 偏置
eta = 1 # 学习率
N = 5 # 迭代次数
niter = 0 # 当前迭代次数
ww,bb=perceptron(niter,w,b,eta)
print("w={0},b={1}".format(ww, bb))
使用sklearn.linear_model库中的Perceptron实现分类
from sklearn.linear_model import Perceptron
import numpy as np
X = np.array([[3,3],[4,3],[1,1]]) # 实例的特征向量
y = np.array([1,1,-1]) # 实例的类别
p = Perceptron(max_iter=100, shuffle=False)
p.fit(X,y)
print("w =", p.coef_)
print("b =", p.intercept_)