最近在听斯坦福cs231n assignment1的课程,完成了assignment1的第一个作业knn.iqynb,下面把过程记录下来:
import random
import numpy as np
from data_utils import load_CIFAR10
import matplotlib.pyplot as plt
# This is a bit of magic to make matplotlib figures appear inline in the notebook
# rather than in a new window.
%matplotlib inline
plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
# Some more magic so that the notebook will reload external python modules;
# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython
%load_ext autoreload
%autoreload 2
首先是加载下好的包
跟着代码显示图片:
把数据存储到矩阵中:
注意其中的3072是32*32*3得来,np.reshape(x_test,(X_test.shape[0],-1)里,-1表示,变换行列数后的矩阵的列数等于原有元素个数除以新给定的行数。
接下来用到的函数就要我们自己写了:
首先要完成两个循环版本的矩阵距离的范数:
写好后运行:我们可以看到保存范数的矩阵的shape,然后可视化距离:
接下来是写Predict函数,不同K值的结果如图:
函数:
接下来分别用一次循环和零次循环求距离:
一次循环求距离利用矩阵一行与整体矩阵加法规则:
该行与矩阵每一行作加法。
零次循环:
这种办法比较难想到 主要是用公司(A-B)^2=A^2+B^2-2A*B
然后是比较循环的时间和准确度,显示是零次循环最快:
然后是交叉检验:我用的代码比较啰嗦
然后画出不同K值的准确度的图:
取K等于10的时候最高,准确率为: