cs231n作业一 knn
cs231——knn作业
cs231——knn作业
- cs231——knn作业
- 1.基础概念
- 1.1 self.X_train
- 1.2 y_train
- 1.3 X
- 2.作业一——两层循环实现
- 3作业二——实现knn投票机制
- 4作业三——使用一层循环实现
- 5作业四——不用循环
- 6作业五--交叉验证
1.基础概念
1.1 self.X_train
这是训练集,是由n*d的二位向量组成,表示由n个样本,每一个样本有d个特征值,就是把图片拉直了
1.2 y_train
这是训练集的标识,由数值组成,是n*1组成的,范围在0-9之间
def train(self, X, y):"""Train the classifier. For k-nearest neighbors this is justmemorizing the training data.Inputs:- X: A numpy array of shape (num_train, D) containing the training dataconsisting of num_train samples each of dimension D.- y: A numpy array of shape (N,) containing the training labels, wherey[i] is the label for X[i]."""self.X_train = Xself.y_train = y
1.3 X
这是测试集,由m*d的二位向量组成,表示m个样本
通过上面的训练,来输出x的标识。
2.作业一——两层循环实现
dists【i,j】标识测试集里的样本x与,训练及的样本j,之间的欧氏几何距离,就是空间距离
表示每个特征值之间的差的平方,开根号
第一步就是np.sqrt开平方
第二步就是求和,使用np.sum
第三步就是两个样本之间的差值
X【i,:】表示1*d的样本,就是第i个样本的所有特征值,有d个值组成
self。X【j,:】表示第j个训练值
np.square(X[i,:]-self.X_train[j,:]
因为都是1*d的,所以可以减,生成的就是两个样本,不同特征的之间差值
np。square就是让差值来进行求平方
综上,代码如下
dists[i,j] =np.sqrt(np.sum(np.square(X[i,:]-self.X_train[j,:])))
3作业二——实现knn投票机制
由于作业一已经计算出了测试集i与训练集j之间的样本差值,我们可以找出与测试集i差最小的k个训练集j,就是找出dists【i,:】前k个小的元素。
# TODO: #
# Use the distance matrix to find the k nearest neighbors of the ith #
# testing point, and use self.y_train to find the labels of these #
# neighbors. Store these labels in closest_y. #
# Hint: Look up the function numpy.argsort.
题目已经给了hint,让我们学习使用argsort这个函数
这个函数返回数组下标,由小到大的元素的下标
indexs = np.argsort(dists[i,:])
返回的是一个下标列表
因此我们可以使用的机制,取前k个
k_indexs = indexs[:k]
最后给这些最近的k个样本,进行标识,找出这k个训练集的样本值
closest_y = self.y_train[k_indexs]
返回的都是数值,最后我们进行求这k个里面,那些数值出现的次数最多,那就是测试集i的标识
y_indexs = np.zeros(10)# 生产10个类别的数组for j in closest_y:y_indexs[j]+=1y_pred[i] = np.argmax(y_indexs)
4作业三——使用一层循环实现
这里就需要使用广播的机制。
题目需求如下:
and store the result in dists[i, :].
需要储存在dists【i,:】
表示1*n的列表
x【i,:】是1*d的向量
self.x_train是n*d
通过广播,x【i,;】变成n*d的元素
于是这两个可以相减,变成n*d,于此同时,我们可以使用square来进行求平方操作
我们可以使用np.sum(axis=1),来消灭列元素,就是变成n*1,对每个样本的特征值进行求和
由于使用axis=1,返回的是列表,最终变成1*n的元素,最后进行每个列表开方
最终代码如下:
dists[i, :] = np.sqrt(np.sum(np.square(self.X_train - X[i, :]), axis=1))
5作业四——不用循环
Try to formulate the l2 distance using matrix multiplication ,and two broadcast sums.
提示是把公式展开,然后使用两次广播
dists数组是由m*n组成的
x是由m*d,生成mx1,也就可以广播mxn,方法就是按上面的平方再求和,keepdims=1来保持是二位矩阵
self。x_train就是n*d的数组,变成1xn,就可以广播程mxn
通过点成我们可以变成m*n的数组
矩阵点乘,就是m*d,与d**n,生成mn的向量
[[
a = np.sum(np.square(X), axis=1, keepdims=True)
b = np.sum(np.square(self.X_train), axis=1, keepdims=True).T
dists = np.sqrt(a + b - 2 * X.dot(self.X_train.T))
6作业五–交叉验证
Hint: Look up the numpy array_split function
提示使用arry_spilt这个函数
np.array_split(X_train, num_folds, axis=0)
按行切割,切分成num份数
X_train_folds = np.array_split(X_train, num_folds, axis=0)
y_train_folds = np.array_split(y_train, num_folds, axis=0)
分割x与y,进行生成测试集,验证集,与训练集
验证集就是当验证num次,当i=0到num-1,为i就是验证集
for k in k_choices:k_to_accuracies[k] = []for i in range(num_folds):X_train_c = X_train_folds.copy()y_train_c = y_train_folds.copy()X_test_i = X_train_c.pop(i)y_test_i = y_train_c.pop(i)X_train_i = np.concatenate(X_train_c, axis=0)y_train_i = np.concatenate(y_train_c, axis=0)# two extra approaches# X_test_i = X_train_folds[i]# y_test_i = y_train_folds[i]# X_train_i = np.concatenate([X_train_folds[j] for j in range(num_folds) if j != i])# y_train_i = np.concatenate([y_train_folds[j] for j in range(num_folds) if j != i])# X_train_i = np.concatenate(np.delete(X_train_folds, i, 0))# y_train_i = np.concatenate(np.delete(y_train_folds, i, 0))classifier = KNearestNeighbor()classifier.train(X_train_i, y_train_i)y_test_pred_i = classifier.predict(X_test_i, k=k, num_loops=0)num_correct = np.sum(y_test_pred_i == y_test_i)accuracy = float(num_correct) / len(y_test_i)k_to_accuracies[k].append(accuracy)
去掉i就是训练集,使用concatenate来进行连接剩下的数组
cs231n作业一 knn相关推荐
- 手把手教你写CS231N作业一 KNN分类器 详细解析 作业源文件 数据集
一些准备工作 python环境 官方课程给出的源文件在这里 根据文件里的指导一步步编写答案就可.第一个实现KNN分类器. 如果是windows环境,需要首先下载数据集.The CIFAR-10 dat ...
- cs231n作业1——knn
导入数据 import random import numpy as np from cs231n.data_utils import load_CIFAR10 import matplotlib.p ...
- 【cs231n作业笔记】一:KNN分类器
安装anaconda,下载assignment作业代码 作业代码数据集等2018版基于python3.6 下载提取码4put 本课程内容参考: cs231n官方笔记地址 贺完结!CS231n官方笔记授 ...
- cs231n作业环境配置
cs231n作业的环境配置 查了很多资料,尝试了很多次,终于成功了 参考文章:http://www.manongjc.com/article/30189.html 首先我的电脑是win10(x86), ...
- Windows本地快速搭建cs231n作业环境
之前写过一个关于斯坦福cs321n课程的作业环境搭建教程,cs231n_assignment1_配置作业环境+kNN,不过好像很多人还是在搭建过程中遇到一些问题,导致做不了作业.自己动手实践是学习最快 ...
- cs231n_assignment1_配置作业环境+kNN
作业1:http://cs231n.github.io/assignments2017/assignment1/ 我是在win7电脑上做的. 准备工作: 下载anaconda:https://www. ...
- cs231n作业记录(答案)-ASS1(KNN)
学习了cs231n的课程,感觉有些困难,故做一些记录. 环境配置:jupyter ASS1 P1 KNN算法 (1)第一部分加载数据集,并输出它们的大小. 这个数据集有10个类. Training d ...
- 斯坦福cs231n作业数据集下载
刚看到斯坦福的cs231n课程,看到有课后作业,于是就想试一试, 作业网址https://cs231n.github.io/assignments2020/assignment1/#q1-k-near ...
- CS231n作业2中Cython相关问题的处理
最近磨磨蹭蹭地学着CS231n,看着满屏幕代码不禁感慨Stanford大神们当真深不可测,作业是以挖空形式给出的.这么多代码要让博主从头写,那还不得写到天荒地老-- 博主使用的是2016年的教学录像和 ...
- cs231n作业-assignment1
assignment 1 (cs231n) 文章目录 assignment 1 (cs231n) KNN基础 计算distances 方法一:双层循环 计算distances 方法二:单层循环 计算d ...
最新文章
- 【跟着子迟品 underscore】Array Functions 相关源码拾遗 小结
- python中的及||
- 【WC2016】挑战NPC 【带花树】【建图】
- 【LeetCode - 556】下一个更大元素 III(贪心,思维)
- K8S精华问答 | CentOS下如何配置主机互信?
- linux不识别xfs,centos7 grub2无法识别xfs root分区
- vue如何设置视频封面_vue怎么制作朋友圈封面视频 vue制作朋友圈视频方法
- 【youcans 的 OpenCV 学习课】10. 图像复原与重建
- WindowsServer2008R2安装中文语言包截图详细教程(附语言包下载资源)
- 制作双系统U盘启动盘【Ventoy】
- Google Guava EventBus 消息发布-订阅异步调用使用
- Java 身份证号码验证工具类
- 西米支付:支付宝/微信支付/银联支付通道的接入介绍
- 小游戏之天选之人:通过幸运数字生成双色球号码(随机函数的应用)
- python(2)兔子产子
- 臧圩人:java面试题解惑系列(一)——类的初始化顺序学习笔记
- Android Studio强者之路-刘桂林-专题视频课程
- Python爬取百度图库
- uniapp onReachBottom不触发
- 3601-lpk.dll劫持病毒分析