作业是在ipython下开发完成的,首先要学会使用ipython。
一、IPython使用
Jupyter Notebook是以web交互式的编程接口,是一个编程工具,除了通常的新建、删除、更改、下载编程文件外,还支持在线编程运算可帮助持续开发,特别在企业中有些项目需要持续很长时间的开发,每天下班后关闭jupyter,只要服务器的kernel不关闭,jupyter会保存好开发时的数据缓存和可视化结果,第二天继续开发,而不用又从头再运行,再配合支持markdown的功能,使得jupyternotebook方便记录开发过程和教学。
Anaconda中,自带Jupyter notebooks,打开jupyter有两种方式:
1、开始菜单点击Jupyter notebook,就会打开浏览器的页面。
2、命令窗口执行:jupyter notebook
3、如果想打开ipynb文件,但是浏览器窗口的upload没反应,可以找到文件所在目录,打开cmd窗口,执行jupyter notebook命令。
下面开始作业:
作业一、KNN
KNN的算法思想还是很简单的,简要说一下重点。
基本思想:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息进行预测。通常在分类任务中,使用投票法,即选择这k个样本中出现最多的类别标签作为预测结果;在回归任务中使用平均法,即将这k个样本的输出数值的平均值作为预测结果;另外,基于距离远近进行加权投票或加权平均,如距离大小与样本权重成反比。
从课程中我们也知道,KNN的训练过程很简单,但是预测过程很耗时间和资源,是一种懒惰式的学习。
在KNN的测试过程中,有两点很重要:距离度量的定义和k值的选取。
1)距离的度量:L1距离、L2距离等等
2)K值的选取:k值设置过小会降低分类精度;若设置过大会增加噪声,降低分类效果。通常,k值的设定采用交叉检验的方式(以k=1为基准),经验规则:k一般低于训练样本数的平方根。
作业内容:
1、计算欧式距离
def compute_distances_two_loops(self, X):#作业:用两层循环计算欧式距离,运行时间:21秒
"""
Compute the distance between each test point in X and each training point
in self.X_train using a nested loop over both the training data and the
test data.
Inputs:
- X: A numpy array of shape (num_test, D) containing test data.
Returns:
- dists: A numpy array of shape (num_test, num_train) where dists[i, j]
is the Euclidean distance between the ith test point and the jth training
point.
"""
num_test = X.shape[0]
num_train = self.X_train.shape[0]
dists = np.zeros((num_test, num_train))
for i in xrange(num_test):
for j in xrange(num_train):
dist[i][j]=np.linalg.norm(X[i] - self.X_train[j])
return dists
#以下两种方式体会使用numpy矩阵运算提高算法效率
def compute_distances_one_loop(self, X):#作业:用一层循环计算欧式距离,运行时间:63秒
num_test = X.shape[0]
num_train = self.X_train.shape[0]
dists = np.zeros((num_test, num_train))
for i in xrange(num_test):
dists[i, :] = np.linalg.norm(X[i, :] - self.X_train[:], axis=1)
#这里要注意,dists[i,1] = np.linalg.norm(X[i, :] - self.X_train[1,:], axis=1)
#dists[i,2] = np.linalg.norm(X[i, :] - self.X_train[2,:], axis=1)
return dists
def compute_distances_no_loops(self, X):#作业:用矩阵运算来计算欧式距离,经过运行发现,这种方式是真的快:0.22秒
num_test = X.shape[0]
num_train = self.X_train.shape[0]
dists = np.zeros((num_test, num_train))
#以下做矩阵乘法,注意multiply是对应位置上的元素相乘
dists += np.sum(np.multiply