1. 程式人生 > >cs231n學習筆記第一天--------影象分類上下、Python基礎、線性分類------Python列表切片和numpy切片的區別

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切片的區別

需要注意的問題:
在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

可以看到這才是正確方式~

小結一下:

關於這個翻譯教程,挺容易入門的,不過我也算是有過一些基礎,邊看,邊碼程式碼,驗證,效果還行。
只是還沒有遇到作業,聽說作業才是最重要的~

至於這個切片的區別,主要是我之前不經意之前,很容易被淺複製給坑了!這次總結一下,給大家也提個醒~