TASK2: 第二章 感知机
本次参加的是DataWhale组织的2023年2月份学习计划。学习内容为李航老师的《统计学习方法(第二版)》的第一到六章。习题的解答开源在datawhale的GitHub账号GitHub - datawhalechina/statistical-learning-method-solutions-manual: 《统计学习方法》(第二版)习题解答,在线阅读地址:https://datawhalechina.github.io/statistical-learning-method-solutions-manual
新的了解与想法
这一章相对第一章对我来说要好理解许多,感知机作为后续许多算法的基础,我之前多少还是有一些了解的。
- 首先需要明确的是,感知机是一种线性分类模型,属于判别模型。
- 当训练数据集是线性可分的时候,感知机学习算法的原始形式是收敛的。
- 显然(但需要经过严格地证明),在这种情况下,感知机学习算法得到的超平面并不是唯一的。我们如果添加约束条件从而得到唯一的超平面,就是支持向量机SVM。
- 如果将感知机用于线性不可分的数据集,感知学习算法不收敛,迭代结果就会发生震荡。
- 感知机的学习策略
- 通过样本点到超平面的“距离”之和作为损失函数,通过随机梯度下降法对参数进行优化从而使得损失函数减小。
- 范数:范数就是为了度量方便而定义出的一个概念。主要就是面对复杂空间和多维数组时,选取出一个统一量化的标准,以方便度量和比较。
- 身为数学基础很弱欸的人,我一开始对于使用一个x即可表达在空间中的一个点表示疑惑。但是后来通过不严谨的臆想考虑到空间的信息应该是被w这个权重值的向量表达了,因此可以使用一个x仅仅表达它在“一条线上”的位置。也就是和数轴差不多的意思。
- 数学基础很弱欸指只学了微积分上甚至还没有经过期末考试的检验,其余的都是零零散散了解到的。
- 通过样本点到超平面的“距离”之和作为损失函数,通过随机梯度下降法对参数进行优化从而使得损失函数减小。
- 感知机学习算法
- 感知机学习算法的原始形式,使用的就是w和b来对超平面进行表达。而η表示学习率。
- 学习率就相当于步长,当发现误分类点时,向正确分类移动一次的步长。
- 以二维平面为例,w的改变相当于对超平面(这里就是直线)的角度进行改变,b的改变相当于对超平面进行平移。
- 感知机学习算法的对偶形式,通过对感知机原始形式的学习过程进行分析,可以得到最终的w和b的产生原因,即w是w+ηyx,b是b+ηy。因此这里直接使用
- 对偶形式中训练实例仅以内积的形式出现,为了方便,可以预先将训练集中实例间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵。
- 感知机学习算法的原始形式,使用的就是w和b来对超平面进行表达。而η表示学习率。
习题
2.1验证感知机为什么不能表示异或
解答思路:
- 列出异或函数(XOR)的输入和输出;
- 使用图例法证明异或问题是线性不可分的;
- 使用反证法证明感知机无法表示异或。
2.2模仿例题构建从训练数据集求解感知机模型的例子
解答思路:
按照书中第38~39页感知机学习算法2.1,编写代码并绘制分离超平面
下面的代码并不严格按照书上的格式,实不相瞒,用chatGPT写的,自己做了一些修改。
因为最近在了解rust,所以是用rust实现的。没有用rust的数组库ndarray库,直接用的rust的vector。
fn perceptron(inputs: &[f64], weights: &[f64], bias: f64) -> f64 { let mut sum = 0.0; //距离,初始化for (input, weight) in inputs.iter().zip(weights.iter()) { sum += input * weight; } sum += bias; //求当前点距离let activation = 1.0 / (1.0 + (-sum).exp()); //激活let output = if activation > 0.5 {1.0} else {0.0}; //通过距离激活后的大小判断是否为误分类点output }fn train_perceptron(inputs: &[f64], targets: &[f64], weights: &mut [f64], bias: &mut f64, learning_rate: f64) { let error = targets[0] - perceptron(inputs, weights, *bias); *bias += error * learning_rate; for (i, weight) in weights.iter_mut().enumerate() { *weight += inputs[i] * error * learning_rate; //更新权重} }fn main() { let inputs = vec![1.0, 2.0, 3.0]; let targets = vec![1.0]; let mut weights = vec![0.1, -0.2, 0.3]; let mut bias = 0.0; let learning_rate = 0.01; for _ in 0..100 { train_perceptron(&inputs, &targets, &mut weights, &mut bias, learning_rate); } let output = perceptron(&inputs, &weights, bias); println!("Output: {}", output); }
/*
简直折磨
*/
2.3证明样本集线性可分的充要条件是正实例点集所构成的凸壳与负实例点集所构成的凸壳互不相交
这是超平面分离定理来着吧。
身为一个数学基础很弱的人,我用不严谨但通俗的语言描述这个问题。在二维平面中,点集所构成的凸壳相当于凸多边形,因此问题转变成证明两个凸多边形可以被一条直线分开与这两个凸多边形不相交是充要条件。由于证明过程并不严谨,下面的结论中并不会以“凸壳”进行表述,仅供自己理解。
充分性:证明两个凸多边形可以被一条直线分开,则这两个凸多边形不相交
反证法,如果这两个凸多边形相交则必有其边线段相交,则其中一个多边形的顶点在另一个多边形内,无法用一条直线分开。与两个凸多边形可以被一条直线分开矛盾。
故两个凸多边形可以被一条直线分开,则这两个凸多边形不相交。
必要性:证明两个凸多边形不相交,则这两个凸多边形可以被一条直线分开
找到一组其中一个多边形的点离另一个多边形的线距离最小的点线组合。过该点作平行于该线段所在直线的直线,即可得到其中一个解。这种操作方法应该同样适用于三维空间,但更高的肯定需要数学的表达。
看了第2章 感知机 (datawhalechina.github.io)习题解答,我感到不是很懂,符号认不全,查资料后认识符号与基本的含意了,能理解计算过程,但仍然云里雾里。