感知机(Perceptron)—有监督学习方法、非概率模型、判别模型、线性模型、参数化模型、批量学习、核方法
定义
假设输入空间(特征空间)是 χ \chi χ ⊆ R n \subseteq R^n ⊆Rn,输出空间是y = { + 1 , − 1 } =\{+1,-1 \} ={+1,−1} 。输入 x ∈ χ x \in \chi x∈χ表示实例的特征向量,对应于输入空间(特征空间)的点;输出 y ∈ y \in y∈y表示实例的类别。由输入空间到输出空间的如下函数:
f ( x ) = s i g n ( ω ⋅ x + b ) f(x)=sign(\omega \cdot x+b) f(x)=sign(ω⋅x+b),称为感知机
其中 ω \omega ω和b为感知机模型参数:
权值(weight)或权值向量(weight vector) ω ∈ R n \omega \in R^n ω∈Rn
偏置(bias): b ∈ R b \in R b∈R
ω 和 x 的内积: ω ⋅ x \omega和x的内积:\omega \cdot x ω和x的内积:ω⋅x
符号函数: s i g n ( x ) : { + 1 , x ≥ 0 − 1 , x < 0 sign(x):\begin{cases} +1,x \geq 0 \\ -1,x < 0 \end{cases} sign(x):{+1,x≥0−1,x<0
输入空间
T= { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } \left\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\right\} {(x1,y1),(x2,y2),…,(xN,yN)}
import numpy as np
import time
start = time.time()
def loadData(fileName,lines=60000):'''加载Mnist数据集(下载地址:https://download.csdn.net/download/nanxiaotao/89720991):param fileName:要加载的数据集路径:return: 训练数据集'''# 定义数据集dataSet = np.zeros((lines, 785))# 打开文件fr = open(fileName, 'r')i = 0# 将文件按行读取for line in fr.readlines():# 对每一行数据按切割福','进行切割,返回字段列表curLine = line.strip().split(',')# Mnsit有0-9是个标记,由于是二分类任务,所以将>=5的作为1,<5为-1x = [int(num)/255 for num in curLine[1:]]if int(curLine[0]) >= 5:dataSet[i] = np.append(x, 1)else:dataSet[i] = np.append(x, -1)i=i+1#返回训练数据集return dataSet
train_dataSet = loadData('../Mnist/mnist_train.csv')
特征空间(Feature Space)
train_dataSet[0][0:784]
统计学习方法
模型
决策函数: f ( x ) = ω ⋅ x + b f(x)=\omega \cdot x+b f(x)=ω⋅x+b
策略
− y i ( ω ⋅ x i + b ) ⩾ 0 -y_i(\omega \cdot x_i + b ) \geqslant 0 −yi(ω⋅xi+b)⩾0
算法
− y i ( ω ⋅ x i + b ) ⩾ 0 -y_i(\omega \cdot x_i + b ) \geqslant 0 −yi(ω⋅xi+b)⩾0
ω ⇐ ω + η y i x i \omega \Leftarrow \omega + \eta y_i x_i ω⇐ω+ηyixi
b ⇐ b + η y i b \Leftarrow b + \eta y_i b⇐b+ηyi
def model_train(train_dataSet, iter=10):''':param train_dataSet:训练数据集:param iter: 迭代次数:return: w和b'''dataMat = np.mat(train_dataSet[:,0:784])labelMat = np.mat(train_dataSet[:,784:785])m, n = np.shape(dataMat)w = np.zeros((1, np.shape(dataMat)[1]))b = 0lr = 0.0001#进行iter次迭代计算for k in range(iter):for i in range(m):xi = dataMat[i]yi = labelMat[i]if -1 * yi * (w * xi.T + b) >= 0:w = w + lr * yi * xib = b + lr * yiprint('iter %d:%d training' % (k, iter))return w, b
w, b = model_train(train_dataSet, iter = 30)
假设空间(Hypothesis Space)
{ f ∣ f ( x ) = ω ⋅ x + b } \left\{f|f(x) = \omega \cdot x + b \right\} {f∣f(x)=ω⋅x+b}
输出空间
y = { + 1 , − 1 } =\{+1,-1 \} ={+1,−1}
模型评估
训练误差(Training Error)
test_dataSet = loadData('../Mnist/mnist_test.csv',10000)
def model_test(test_dataSet, w, b):'''测试准确率:param test_dataSet:测试数据集:param w: 训练获得的权重w:param b: 训练获得的偏置b:return: 正确率'''dataMat = np.mat(test_dataSet[:,0:784])labelMat = np.mat(test_dataSet[:,784:785])m, n = np.shape(dataMat)errorCnt = 0for i in range(m):xi = dataMat[i]yi = labelMat[i]result = -1 * yi * (w * xi.T + b)if result >= 0: errorCnt += 1accruRate = 1 - (errorCnt / m)return accruRate
accruRate = model_test(test_dataSet, w, b)
