统计学原理笔记
CH1
- 监督学习
- 输入变量X,输出变量Y:
- X连续,Y连续->回归问题
- X连续,Y有限离散->分类问题
- X离散,Y离散->标注问题
- 监督学习X与Y的联合分布存在,训练数据与测试数据独立同分布于P(X,Y)
- 统计学习三要素
- 模型
监督学习中,模型就是所要学习的条件分布或者决策函数。 - 策略 就是按照什么样的准则选择最有的模型。
- 损失函数(代价函数),度量一次预测好坏,常见的损失函数有:
- 0-1损失函数
- 平方损失
- 绝对损失
- 对数损失(对数似然损失函数)
- 风险函数,度量平均意义下模型预测的好坏,期望损失。由于(X,Y)的分布是未知的,一般采用经验风险函数代替期望风险。
- 经验风险最小化(ERM),适合样本容量大,样本小容易出现过拟合
- 结构风险最小化(SRM),防止过拟合,在经验风险的基础上加上正则项,J()表示模型的复杂度,是F上的泛函。结构风险最小意味着经验风险和模型复杂度同时小。
- 损失函数(代价函数),度量一次预测好坏,常见的损失函数有:
- 算法,是指学习模型的具体方法。统计学习问题归结为最优化问题。
- 模型选择方法
- 正则化
模型月复杂,正则化值越大,例如正则化可以是模型参向量的范数 - 交叉验证 应对数据不充足,交叉验证的基本思想是重复使用数据。
- 泛化能力
- 监督学习方法分为:生成方法和判别方法
- 生成方法由数据学习联合概率分布,然后求条件概率分布
- 判别方法直接由数据学习决策函数或者条件概率分布
- 分类问题
- 二分类常见评价指标
通常将关注的分类标记为正类。正类 负类 正确 TP TN 错误 FT FN - 准确率:P = TP / ( TP+FP )
- 召回率:R = TP / ( TP+FN )
CH2感知机
-
定义
设输入空间 X⊆RnX\subseteq R^nX⊆Rn,输出空间Y⊆{+1,−1}Y\subseteq \{+1, -1\}Y⊆{+1,−1},输入 x⊆Xx\subseteq Xx⊆X表示实例的特征向量,输出 y⊆Yy\subseteq Yy⊆Y表示实例的类别,由输入空间到输出空间的函数为:f(x)=sign(w⋅x+b)f(x)=sign(w\cdot x+b)f(x)=sign(w⋅x+b)
其中,www、bbb是感知机模型参数,w∈Rnw \in R^nw∈Rn叫做权值,b∈Rb \in Rb∈R叫做偏置。感知机是一种线性分类模型。
感知机的集合解释线性方程
w⋅x+b=0w \cdot x + b = 0w⋅x+b=0
对应 RnR^nRn 中的一个超平面,www 是其法向量,bbb 是其截距。 -
感知机的学习策略
输入空间 RnR^nRn 中的任一点 x0x_0x0 到超平面 SSS 的距离为
1∥w∥∣w⋅x0+b∣\frac{1}{\lVert w \rVert}\lvert w\cdot x_0 + b \rvert∥w∥1∣w⋅x0+b∣∥w∥\lVert w \rVert∥w∥ 是 www 的 L2L_2L2 范数。
假设超平面 SSS 的误分类集合为 MMM ,那么所有误分类点到超平面的总距离为−1∥w∥∑xi∈Myi(w⋅xi+b)-\frac{1}{\lVert w \rVert}\sum_{x_i\in M} y_i(w \cdot x_i + b)−∥w∥1xi∈M∑yi(w⋅xi+b)
不考虑 1∥w∥\frac{1}{\lVert w \rVert}∥w∥1 就得到感知机的损失函数。
给定训练集 T={(x1,y1),(x2,y2),...,(xN,yN)}T = \{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}T={(x1,y1),(x2,y2),...,(xN,yN)},其中 xi∈X=Rnx_i \in X = R^nxi∈X=Rn,yi∈{+1,−1}y_i \in \{+1,-1\}yi∈{+1,−1},i=1,2,...,Ni=1,2,...,Ni=1,2,...,N。感知机的损失函数定义为L(w,b)=−∑xi∈Myi(w⋅xi+b)L(w,b)=-\sum_{x_i \in M}y_i(w\cdot x_i+b)L(w,b)=−xi∈M∑yi(w⋅xi+b)
其中 MMM 是误分类点。
-
感知机学习算法
采用随机梯度下降法,假设 MMM 是固定的,那么损失函数 L(w,b)L(w,b)L(w,b) 的梯度由
▽wL(w,b)=−∑xi∈Myixi\bigtriangledown_w L(w,b)=-\sum_{x_i \in M}y_ix_i▽wL(w,b)=−xi∈M∑yixi
▽bL(w,b)=−∑xi∈Myi\bigtriangledown_b L(w,b)=-\sum_{x_i\in M}y_i▽bL(w,b)=−xi∈M∑yi
随机选取一个误分类点 (xi,yi)(x_i,y_i)(xi,yi) ,对 w,bw,bw,b 更新:
w=w+ηyixiw=w+\eta y_i x_iw=w+ηyixi
b=b+ηyib=b+\eta y_i b=b+ηyi
式中 0<η≤10\lt \eta \le10<η≤11.感知机学习算法的原始形式:
输入:训练数据 T={(x1,y1),(x2,y2),...,(xN,yN)T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)T={(x1,y1),(x2,y2),...,(xN,yN) ,y∈Y={−1,+1}y \in Y=\{-1,+1\}y∈Y={−1,+1} ,i=1,2,....,Ni=1,2,....,Ni=1,2,....,N ,学习率 η(0<η≤1)\eta (0\lt \eta \le1)η(0<η≤1)
输出:w,bw,bw,b,感知机模型 f(x)=sign(w⋅x+b)f(x)=sign(w\cdot x + b)f(x)=sign(w⋅x+b)
(1)选取初值 w0,b0w_0,b_0w0,b0
(2)在训练集中选取数据 (xi,yi)(x_i,y_i)(xi,yi)
(3)若 yi(w⋅xi+b)≤0y_i(w\cdot x_i + b)\le 0yi(w⋅xi+b)≤0
w=w+ηyixiw=w+\eta y_i x_iw=w+ηyixi
b=b+ηyib=b+\eta y_ib=b+ηyi
(4)转至(2),直至训练组中没有误分类点。2.感知机学习算法的对偶形式
输入:训练数据 T={(x1,y1),(x2,y2),...,(xN,yN)T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)T={(x1,y1),(x2,y2),...,(xN,yN) ,y∈Y={−1,+1}y \in Y=\{-1,+1\}y∈Y={−1,+1} ,i=1,2,....,Ni=1,2,....,Ni=1,2,....,N ,学习率 η(0<η≤1)\eta (0\lt \eta \le1)η(0<η≤1)
输出:α,b\alpha,bα,b,感知机模型 f(x)=sign(∑j=1Nαjyjxj⋅x+b)f(x)=sign(\sum_{j=1}^{N}\alpha_j y_j x_j \cdot x + b)f(x)=sign(∑j=1Nαjyjxj⋅x+b) 其中 α=(α1,α2,...,αN)T\alpha=(\alpha_1,\alpha_2,...,\alpha_N)^Tα=(α1,α2,...,αN)T
(1)α=0,b=0\alpha=0,b=0α=0,b=0
(2)选取数据(xi,yi)(x_i,y_i)(xi,yi)
(3)若yi(∑j=1Nαjyjxj⋅x+b)≤0y_i (\sum_{j=1}^{N}\alpha_j y_j x_j \cdot x + b) \le 0yi(∑j=1Nαjyjxj⋅x+b)≤0
αi=αi+η\alpha_i=\alpha_i+\etaαi=αi+η
b=b+ηyib=b+\eta y_ib=b+ηyi
(4)转(2)直到没有误分类点
可预先计算训练集实例间的内积矩阵 Gram 矩阵
G=[xi⋅xj]N×NG=[x_i \cdot x_j]_{N \times N}G=[xi⋅xj]N×N -
感知机应用样例
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
'''
感知机应用:鸢尾花分类
数据下载地址:https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
数据格式描述:
一共150行数据包含三个花的品种,Iris-setosa(山鸢尾),Iris-versicolor(变色鸢尾),Iris-virginica(北美鸢尾),每个品种50个样本,
范围依次为[0,50]、[50,100]、[100,150]
每行有5列,分别为:
花萼长度 花萼宽度 花瓣长度 花瓣宽度 花的种类
本次实验只选取其中任意两个特征进行训练
'''
# feature = ['e_L', 'e_w', 'b_L', 'b_w']
def plotGraph(x):
plt.scatter(x[0:50, 0], x[0:50, 1], color="red", marker="o", label="setosa")
plt.scatter(x[50:100, 0], x[50:100, 1], color="blue", marker="x", label="versicolor")
plt.legend(loc="upper left")
plt.show()
'''
:param i:选取第i列特征
:param j:选取第j列特征
:return: 返回属性集X和标记集Y
'''
def loadData(i=0, j=3, file='./data/ch2_iris.data'):
data = pd.read_csv(file, header=None)
y = data.iloc[0:100, 4:5].values
y = np.where(y == 'Iris-setosa', -1, 1)
x = data.iloc[0:100, [i, j]].values
print('X dim is (%d,%d) Y dim is (%d,%d)' % (x.shape[0], x.shape[1], y.shape[0], y.shape[1]))
return x, y
'''
根据特征的数目初始化权值向量和偏置
:param dim:特征的数目
:return:权值向量和偏置
'''
def initParam(dim):
_w = np.zeros(shape=(dim, 1))
_b = np.zeros(shape=(1, 1))
return _w, _b
def train(x, y, alpha=0.9, iteration=100):
shape_y = y.shape
shape_x = x.shape
w, b = initParam(shape_x[1])
assert x.shape[1] == w.shape[0]
for i in range(iteration):
# 根据模型计算分类
y_ = np.sign(np.dot(x, w) + b).reshape(shape_y)
# 找出分类错误的样本点
error = np.where((y_ * y) <= 0, 1, 0).reshape(shape_y)
# 根据样本点修正权值和偏置
delta = alpha * np.sum(error * y * x, axis=0, keepdims=True)
w = w + delta.T
b = b + alpha * np.sum(error * y, keepdims=True)
if (i + 1) % 10 == 0:
print('num %d iterations,error rate is %.2f%%' % (i + 1, np.sum(error) / shape_y[0] * 100))
return w, b
def plotLine(x, w, b):
plt.scatter(x[0:50, 0], x[0:50, 1], color="red", marker="o", label="setosa")
plt.scatter(x[50:100, 0], x[50:100, 1], color="blue", marker="x", label='versicolor')
x0_max = np.max(x[:, 0])
x0_min = np.min(x[:, 0])
x0 = np.linspace(x0_min, x0_max, 20)
x1 = (-x0 * w[0] - b[0]) / (w[1] + 1e-10)
plt.plot(x0, x1, color='green')
plt.legend(loc="upper left")
plt.show()
if __name__ == '__main__':
# 加载数据
X, Y = loadData()
# 训练
w_, b_ = train(X, Y, 0.8, 100)
# 打印权值和偏置
print('the weights are:\n', w_)
print('the bias is:', b_)
# 画出分界线
plotLine(X, w_, b_)