一.k近邻(k-Nearest Neighbor)算法
1.训练:分类器简单地记住全部数据
2.预测:计算测试数据和所有训练数据之间的距离,利用k近邻算法找到最近的k个点,用投票机制选择k个中出现最多的label作为预测label。
二.加载数据集
1.CIFAR10数据集介绍
CIFAR10数据集包含十个类别,60000张图片,每个类别6000张
下载数据集解压后分为以上文件:
batches.meta为ASCII编码文件,记录0-9标签对应的类别名。
下边六个data_batch.bin文件每个各包含10000张照片,二进制编码,每张 照片尺寸为32×32×3,所以每个文件字节数为10000*3072。
2.加载数据集代码
#该函数设置序列化读入文件
def load_pickle(f):
version = platform.python_version_tuple()
if version[0] == '2':
return pickle.load(f)
elif version[0] == '3':
return pickle.load(f, encoding='latin1')
raise ValueError("invalid python version: {}".format(version))
#加载一个batch
def load_CIFAR_batch(filename):
""" load single batch of cifar """
with open(filename, 'rb') as f:
datadict = load_pickle(f) #datadict字典 包括两个关键字 ‘data’和‘labels’
X = datadict['data'] #10000*3072(32*32*3)的数组
Y = datadict['labels'] #10000*1 每个数范围为0-9
X = X.reshape(10000, 3, 32, 32).transpose(0,2,3,1).astype("float")
Y = np.array(Y)
return X, Y
#该函数为加载数据集主函数,返回训练集和测试集的数据和标签
def load_CIFAR10(ROOT):
""" load all of cifar """
xs = []
ys = []
for b in range(1,6):
f = os.path.join(ROOT, 'data_batch_%d' % (b, ))
X, Y = load_CIFAR_batch(f)
xs.append(X)
ys.append(Y)
#加载X_train Y_train
Xtr = np.concatenate(xs) #array(【】【】【】【】)→array(【】)拼接起来
Ytr = np.concatenate(ys) #拼接五个batch的图片数据和label
del X, Y
#加载X_test Y_test
Xte, Yte = load_CIFAR_batch(os.path.join(ROOT, 'test_batch'))
return Xtr, Ytr, Xte, Yte
三.欧式距离计算
1.双循环
def compute_distances_two_loops(self, X):
num_test = X.shape[0]
num_train = self.X_train.shape[0]
dists = np.zeros((num_test, num_train)