为了梳理在大学学到的知识,我把slide重新看一遍并附上自己实现的python代码,各位同学同行请多多指教。
课件来自某英国G5大学课程Supervised learning 一共9个课件。
监督学习问题:
什么是监督学习呢?
课件上的定义:Given a set of input /output pair we wish to compute the functional relationship between the input and the output.
x ---->f .---->y
翻译过来就是
给定一组输入输出,我们想计算出输入输出的函数关系。
比如输入为图片,输出为图片形象的类别。
我们希望学习的方法是stable,efficient,robust的。
监督学习模型:supervised learning Model
给定一个训练数据 S。S ={(x1,y1),(x2,y2),(x3,y3},(x4,y4)...}
推断出 fs(xi)≈yi
对于分类classification y∈{-1,+1},回归Regression:y∈R
也就是说分类问题默认只有两个类别,这两个类别是对立的。若现在有数据S 使得 fs(xi) = -1那么
-fx(xi)就为1,也就是说对于分类问题,-1,+1只是代表了两个类别,而函数fs可以计算出这个类别,从而达到分类的效果。
而regression是实数,意味着它相当于预测。通过regression我们可以计算出y的准确值,而不是分类问题中的类别值。
简单问题:
给定数据集
S = {((1,1),3)
((2,3),7)
}
如何预测y3?(x3 = (4,2))
这里假设y和x有线性关系 ,则可以将两个数据点考虑成两个方程。2个方程联立求解就可以得到我们熟悉的线性代数中的线性系统了、
w1 + w2 = 3
2w1 + 3w2 = 7
转换成矩阵
Xw = y (where X size = 2 *2, w = 2*1)
不懂矩阵乘法的可以百度一下,很简单,就是把乘号右边的列逆时针转90度然后跟乘号左边的矩阵的行做内积。
既然是线性系统就有两种失败的情况,overdetermined 和underdetermined。这两种情况是什么意思呢?
所谓的overdetermined就是指两个方程相互驳斥,使得方程无解。
而underdetermined就是方程的数量少于w的维度。我们知道n元一次方程需要n个方程联立求解,在这个问题下就是n元一次方程系统只有少于n的方程,这样对未知数的约束不够,无法得到唯一解。(不懂的看看小学课本哈哈)
由此我们得到预测器predictor(线性回归)
y_hat = w x,
w为行向量,x为列向量。(x 和上面的X不一样,大X是全部的数据,x只是一个数据点)
在实际问题中,因为噪音存在或者本身函数就为非线性的,我们无法得到一个完美的超平面涵盖所有的点。那么怎么办呢?
其中一个方法就是使用最小二乘法求解。
最小二乘法就是使得经验误差最小,取出改误差下的w。
而经验误差为(预测值yhat - 真实值 y)^2在所有数据上的平均值。
最后通过误差loss在w上的偏导数可以得到最优w
w = (XTX)^-1XTy
XT为X的转置矩阵,y为label,就是前面线性系统的等号右边的数组成的列向量.
3
7
后来我发现,如果这个系统完全是线性的而且没有noise,
Xw = y
w = X^-1 y
我们可以发现最优w依然成立,
w = (XTX)^-1XTy = X^-1 *XT^-1* XT *y =X^-1 y 。
拓展思考:如何计算出w 若y_hat = xw +b
到此线性回归暂停,我们来对比一下knn。
k nearest neighbours
k近邻算法
这个算法简单来说就是给定一个输入点x,然后查询距离这个输入数据点x最近的k的点他们的label,然后以多数分类为预测结果。
那么这里我们可以自己随意定义距离的计算式Distance(x,x'),也可以自己选择k。
k越小分类边界越不平整。
任意算法的误差分解。
E[(y' - A(x')^2)] =
E[(y' - f*(x')^2)] 贝叶斯误差
+f*(x') - E[A(x')] 偏差
+E[(A(x') - E[A(x')])^2] 方差
偏差是算法和真实的差距
方差是算法在在不同数据集上(效果)的方差。
后面是knn和1nn的算法效果的证明。。略过了,实用性不大。
假设空间
假设空间就是一个假设的集合,例如线性预测器不同参数的集合。那么总有一个参数可以让training error(也就是我们说的经验误差在训练集上)达到最小。但最小的training error不代表最佳的函数,因为算法会在不同的数据上产生不同的效果,因此,我们要留一部分作为测试数据。
overfitting ,模型过于依赖数据而将数据本身的误差或者通性学会而缺乏正确预测未来数据的能力。
解决方案:
cross validation
将数据分成k份,在k-1份数据上训练,在left的数据上测试,将所有error求均值。在此过程中我们可以evaluate一个模型参数的好坏,然后再改变参数,测试下一个模型。
Python代码编写中。。。。。