knn,SVM,softmax算法简记

最近在学这些东西,然后想简单清晰地把它们的核心写下来。

knn

knn就是k-NearestNeighbor,k个最相近的邻居。
算法思路为
1.首先有人工标好类的若干张图片,每张图片有一个它对应的类的标签号
2.对每个测试用例,计算所有测试用例与它的所有像素差的平方的和的开方,就是那个欧几里得距离(Euclidean),代码里面就是:

for i in range(num_test):
      for j in range(num_train):
        distances = np.sqrt(np.sum(np.square(self.X_train[j] - X[i])))
        dists[i,j]=distances

3.然后对于所有测试用例按照欧几里得距离升序排列,找前k个用例,对这k个用例的标签号统计,找出里面的标签号出现次数最多的,然后认为该测试用例打这个标签号对应的类标签。

SVM

别人写得太好,比如:这个,以及这个。
总结一下算法的步骤如下:
1.首先有一个标好标签的图片集和标签集,将图片集分成三类train,validation,test.
其中validation与test的目的不同,训练的过程应为基于train集进行训练(训练的目标是一个扩展了的w矩阵,扩展了一列b),然后训练出的w不是唯一的(因为可以存在缩放等问题),对于所有w取在验证集validation中loss最低的w。最后一步才是在test集上进行测试,计算最终loss。如果没有validation,直接拿test做w的筛选,你很可能选出的只是针对特定test集loss最低的,不能说是对于任意test集都是最低的。形象的讲就是,好比我们大学生应付期末考试,老师都给了重点,我们针对重点(test集)去进行训练我们的大脑,然后考试也不出意外的就考重点,那么ok,在考试中你用的是针对这场考试的最佳大脑。但是这并不意味着你对于整本书掌握的够好,换一张卷子就有问题了。(然而我们应该知道的是自己对于整本书的掌握情况),所以就得这样,基于整本书复习,复习完拿一些真题卷(validation)做测试检验,对于暴露的问题进行修改,最后只做一次那份考卷(test)。cs231n的那个老师的意思大概说你没validation集算开挂,要毙掉的。
2.算score的式子score=wx+b
算loss的式子loss=ave(sum(max(0,sj-syi+1)))+reg
R(w)
其中reg那坨是正则项,就是一个系数乘以一个吃w的函数。它的目的是这样的,如果没有它的存在,我们后面做的事情是不断调整w使最优,那么w可能会过于复杂(复杂的定义后面讲),那么正则项就是w越复杂正则项越大,这样会使得w不会在优化过程中复杂度无限上升。其中复杂度的定义与R的形式有关,R的形式常见的有如下几种:

knn,SVM,softmax算法简记_第1张图片
未命名.jpeg

其中对于L1而言0越少复杂度越高,对于L2而言看的是矩阵的范数
3.算的步骤是首先图片拉成一维向量,然后随机生成初始w,将b加到w最后一列,
对于每张train里的图片,计算score,然后计算loss,然后计算dw。dw原本是根据梯度的定义去算的,loss变化量除以步长,效率太低,采用了解析式的方法,求出dw表达式,(我不会算啊,233)根据这个计算。求完后self.W+=(-grad*learning_rate),更新w。
4.对于新的图片,用训练好的w去预测,计算score,对score里得分最高的那个类就是该图片对应的类。

Softmax

还是看人家的吧。
概括来说,softmax函数能将原先的值映射到(0,1)区间内,且累加和为1,变成了概率的意思。softmax相比于svm,算score的式子没有变,变的是算loss的式子,以及由此发生改变的求dw的式子。loss的式子中用到了softmax函数,loss具体长啥样那个网址里有,其余变化不大。
未完待续。。。
以上仅个人理解,如有错误不吝赐教。

你可能感兴趣的:(knn,SVM,softmax算法简记)