cs231n笔记:K-Nearest Neighbors(KNN)K-近邻算法

K-Nearest Neighbors:
不只寻找单个最近的点,找到最近的K个点,然后K个点投票,票数最多为预测结果

K值越大,决策边界越平滑
k与距离度量均为超参数(不一定能从训练数据中学到,非常依赖问题(需要人为设置))

两种距离:
L1距离(曼哈顿距离):
L2距离(Euclidean distance)(欧式距离):平方和的平方根
平方和的平方根
两种距离的对比:
L1非常依赖数据的坐标系统,向量中的各元素有实际意义
L2不依赖数据的坐标系统

划分数据:
在这里插入图片描述
在训练集上用不同的超参数训练算法,在验证集上进行评估,然后选择验证集上表现最好的一组超参数,用表现最好的分类器在测试集上运行。(必须分离验证集和测试集,训练集占到总data的0.5-0.9)

设定超参数的另一种策略:cross validation(交叉验证)
但由于计算成本昂贵,not usually in deep learning
Typical number of folds you can see in practice would be 3-fold, 5-fold or 10-fold cross-validation

KNN缺点:
1.测试时间很慢
2.L1和L2距离用在比较推向上不太合适:向量化的距离函数不太适合表现图像之间的视觉视觉相似度(图像是高维物体,包含许多像素,高维空间的距离是非常反直觉的)
3.维度灾难:密集分布正在空间中,导致指数倍的训练数据

# assume we have Xtr_rows, Ytr, Xte_rows, Yte as before
# recall Xtr_rows is 50,000 x 3072 matrix
Xval_rows = Xtr_rows[:1000, :] # take first 1000 for validation
Yval = Ytr[:1000]
Xtr_rows = Xtr_rows[1000:, :] # keep last 49,000 for train
Ytr = Ytr[1000:]

# find hyperparameters that work best on the validation set
validation_accuracies = []
for k in [1, 3, 5, 10, 20, 50, 100]:

  # use a particular value of k and evaluation on validation data
  nn = NearestNeighbor()
  nn.train(Xtr_rows, Ytr)
  # here we assume a modified NearestNeighbor class that can take a k as input
  Yval_predict = nn.predict(Xval_rows, k = k)
  acc = np.mean(Yval_predict == Yval)
  print 'accuracy: %f' % (acc,)

  # keep track of what works on the validation set
  validation_accuracies.append((k, acc))

代码装载自:https://github.com/zhuole1025/cs231n/blob/master/CS231n-notes.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值