准备工作
Python的基本使用尤其是Numpy库必须熟练掌握,Numpy是Python中用于科学计算的核心库。它提供了高性能的多维数组对象,以及相关工具。Numpy创建数组对象大致有:
x = np.array([1, 2, 3]) # Create a rank 1 array
a = np.zeros((2,2)) # Create an array of all zeros
b = np.ones((1,2)) # Create an array of all ones
c = np.full((2,2), 7) # Create a constant array
d = np.eye(2) # Create a 2x2 identity matrix
e = np.random.random((2,2)) # Create an array filled with
# random values
Numpy数组对象支持切片语法和下标访问,广播是其强有力的一个机制。能够自动扩展不同规格的矩阵进行计算。例如:
import numpy as np
# We will add the vector v to each row of the matrix x,
# storing the result in the matrix y
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = x + v # Add v to each row of x using broadcasting
print y # Prints "[[ 2 2 4]
# [ 5 5 7]
# [ 8 8 10]
# [11 11 13]]"
图像分类
图像分类问题,就是已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像。主要存在的困难和挑战有:视角影响、大小变化、形状变化、遮挡、光照、背景干扰、类内差异,也许对于人类来说这些变量的变化一般不会改变我们的判断,但对计算机来说这些图像往往差异巨大。
图像分类算法都采用数据驱动方法,给计算机很多数据,然后实现学习算法,让计算机学习到每个类的外形。数据是机器学习算法最宝贵的资源。
Nearest Neighbor分类器
使用CIFAR-10数据集,Nearest Neighbor算法将会拿着测试图片和训练集中每一张图片去比较,然后将它认为最相似的那个训练集图片的标签赋给这张测试图片。算法思想比较简单也容易实现,具体来说就是考量相似度的计算,常用的有L1距离(曼哈顿距离)和L2距离(欧式距离),计算公式如下:
d
1
=
∑
p
∣
I
1
p
−
I
2
p
∣
d_1 = \sum_{p}|I_1^p-I^p_2|
d1=p∑∣I1p−I2p∣
d
2
=
∑
p
(
I
1
p
−
I
2
p
)
2
d_2 = \sqrt{ \sum_{p}(I_1^p-I^p_2)^2}
d2=p∑(I1p−I2p)2
k-Nearest Neighbor分类器及k值如何确定
k-Nearest Neighbor分类器的思想很简单:与其只找最相近的那1个图片的标签,我们找最相似的k个图片的标签,然后让他们针对测试图片进行投票,最后把票数最高的标签作为对测试图片的预测。
我们可以选择不同的距离度量,选择L1还是L2哪个更好,诸如此类无法从数据中进行学习只能由人提前给机器学习算法设定的参数叫做超参数。一般就是尝试不同的取值看哪个表现最好,但决不能使用测试集来进行调优。测试数据集只使用一次,即在训练完成后评价最终的模型时使用。
所以我们需要从训练集中取出一部分数据用来调优,称之为验证集(validation set)。作图分析出哪个k值表现最好,然后用这个k值来跑真正的测试集。
交叉验证:以5折交叉验证为例,具体来说是将训练集平均分成5份,其中4份用来训练,1份用来验证。然后循环操作,最后取所有5次验证结果的平均值作为算法验证结果。一般在较小训练集上使用。
Nearest Neighbor分类器评价
易于实现,训练不需要花时间(实际是存储过程),测试要花费大量时间计算,仅适用于数据维度较低的数据,在图像分类中很少使用,但适合初学者入门学习。
下周计划
继续学习线性分类器。