第一节课大部分都是废话。第二节课的前面也都是废话。
First classifier: Nearest Neighbor Classifier
在一定时间,我记住了输入的所有的图片。在再次输入一个图片之后,我和之前的图片进行比较,然后输出分类。
近邻分类器用50000张32*32 10labels的训练集来训练。我们定义距离为曼哈顿距离d1(I1,I2)=sigma(abs(I1-I2)),我们相互之间算出每个像素的差值,然后加起来就是距离。
然后我们得到距离最小的一个图片,然后看这图片的label是什么。
tip1:这个傻逼算法会随着训练集合增加,速度变得很慢。。
tip2:这个傻逼算法在训练的时候,我们不计算,只会在最后测试的时候才计算。
加速方法:加速近邻距离的计算,加速匹配。
改变方法:我们亦可以使用不同的距离计算方法,比如欧氏距离。
升级版:KNN,我们找k个最近的list,然后让里面的实例进行vote,票数最多的就是这个分类。k越大分界线越平滑。k的选择是一个超参数。
tip1:假设训练集就是测试集,那么nn的准确率就是100%(因为总能找到自己)
tip2:假设是knn,acc就不一定是100%
tip3:我们怎么去设置超参数?这是一个独立问题,我们不知道,你只能不断的去尝试这个超参数的取值(这不是等于没说吗。。。
拟合程度的选择会影响你的泛化能力,你可以使用k-fold来提高你的泛化能力。cross-validation也可以
实际生活中,没人使用这个傻逼算法,因为这个傻逼算法很慢。如果如果图片稍微变了一下(比如往左边平移,比如亮度不一样),距离就会差很多,但实际上这个图片只是小小的改变了一下,knn就会很难识别。(实际上我觉得这应该是你选择的距离计算方法不对)
Linear Classification
神经网络现在非常屌,哪儿都有神经网络。neural networks practitioner,我们就像搭积木一样搭建神经网络。
考虑32323的一个数据集,一个图一共3072个数,我们想知道这个图属于哪一类。
f(x,W)来表示,x是image,W是parameters。输入图片,输出分类。
最简单的线性分类器(fx,W,b) = Wx+b),W是10*3072的矩阵,x是3072*1的矩阵,b是10*1的bias。我们通过不断的调整W和b来到最佳的结果。
tips1:线性分类器做了什么?W就像一个模版匹配,它实际上是用一些分数的加权和,与自己想要的颜色匹配。我们可以把图片想成高伟空间的点,然后线性分类器就是每一条线,描绘这个取样空间中负点指向正点方向的梯度。沿着这条直线,你会得到0分,如果在正方向,距离越远分数越高。
tip2:什么东西线性分类系很难去分类?你的图片如果在3072高维空间是一个圆,那么一条直线很难去很好的分割(自行脑补画面)。灰度图片很难用线性分类器去做,因为特征不够。
定义损失函数,能够quantifying what it means to have a good W.