cs231n学习笔记第一天--------图像分类上下、Python基础、线性分类------Python列表切片和numpy切片的区别

前言:

老规矩,前言的碎碎念还是得有的,cs231n的课之前就想刷来着,室友也一直盯着我,让我刷,说我基础太差,不刷不行,好好好,我来重拾一下,看看究竟用什么方法,才能让我坚持下去。
虽然自己也曾经调用过一些API,整天就是配环境,刷系统,改bug。
但是感觉这段时间一直学的是“术”,得静下心来学点“道”了!
来整整吧~也不给自己立flag和设定时间了,尽力吧~

一、K近邻算法简介:

其实我看到这个翻译教程,以及刚才看的英文视频,发现,这个K近邻算法,好像我记混了,之前学模式识别的时候,也有一个K分类什么的,忘了叫啥了,感觉那个得迭代好几次,为啥这个K近邻就直接算距离?
好吧,我搜了一下,网上目前找到比较全,还算是正经一个教程:
机器学习(一)——K-近邻(KNN)算法
不得不说园子里的文章,从质量上说,一般都比CSDN好一些,感觉很多搜到的CSDN博客都是复制粘贴的,不全就算了,还不加引用链接,真是网上垃圾!强烈鄙视!
然后我引用上面的文章的一段文字:

接下来对KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

具体的算法,我就不实现了,文中有,但是我感觉这种算法没啥用,还复杂,没意思。

二、Python列表切片和numpy切片的区别

今天已经学习教程链接:
学习教程目录:CS231n官方笔记授权翻译总集篇发布
图像分类教程:CS231n课程笔记翻译:图像分类笔记(上)
Python基础教程:CS231n课程笔记翻译:Python Numpy教程
感谢杜客大佬的分享,比直接啃英文版的视频,要好入门的多。
翻译的真是不错,强烈推荐看看。

需要注意的问题:
在Python中,列表的直接等于赋值,是浅赋值,二者是关联的,一个改动,两个都会改,列表的切片是深复制,会重新创建数据;
而numpy数组不一样,直接赋值不清楚,但是切片是浅复制,一个改动,两个都会改。
举例看看:

1.列表直接等于赋值:会关联的。

>>> a = [1,2,3,4,5]
>>> b = a
>>> a[2] = 0
>>> a
[1, 2, 0, 4, 5]
>>> b
[1, 2, 0, 4, 5]

2.列表切片:重新创建

>>> a = [1,2,3,4,5]
>>> c = a[:]
>>> a[2] = 0
>>> a
[1, 2, 0, 4, 5]
>>> c
[1, 2, 3, 4, 5]

3.numpy切片:确实是会改变的,看到一个教程说,这其实是一种叫(view)视图的功能,和list的切片概念都不一样!
教程链接:【Python】numpy 中的 copy 问题详解

>>> a = np.zeros((3,4))
>>> a
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
>>> b = a[:2,:2]
>>> b
array([[0., 0.],
       [0., 0.]])
>>> a[0,0] = 1
>>> a
array([[1., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
>>> b
array([[1., 0.],
       [0., 0.]])

而 b = a[:] 这种形式就属于第二种,即视图,这本质上是一种切片操作(slicing),所有的切片操作返回的都是视图。具体来说,b = a[:]会创建一个新的对象 b(所以 id(b) 和id(a) 返回的结果是不一样的),但是 b 的数据完全来自于a,和 a 保持完全一致,换句话说,b的数据完全由a保管,他们两个的数据变化是一致的!

4.numpy的等于号赋值,看看是啥样:

>>> import numpy as np
>>> a = np.ones((2,3))
>>> b = a
>>> id(a)
140258825212432
>>> id(b)
140258825212432
>>> a[1,1] = 0
>>> a
array([[1., 1., 1.],
       [1., 0., 1.]])
>>> b
array([[1., 1., 1.],
       [1., 0., 1.]])

确实,id都一样。b只是a新增的一个引用而已。

5.numpy的完全复制:
只需要在a后面加一个.copy()就行了
举个例子:

>>> import numpy as np
>>> a = np.ones((2,3))
>>> b = a.copy()
>>> a[1,1]=0
>>> a
array([[1., 1., 1.],
       [1., 0., 1.]])
>>> b
array([[1., 1., 1.],
       [1., 1., 1.]])
>>> id(a)
140247659348496
>>> id(b)
140247659348976

可以看到这才是正确方式~

小结一下:

关于这个翻译教程,挺容易入门的,不过我也算是有过一些基础,边看,边码代码,验证,效果还行。
只是还没有遇到作业,听说作业才是最重要的~

至于这个切片的区别,主要是我之前不经意之前,很容易被浅复制给坑了!这次总结一下,给大家也提个醒~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hehedadaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值