1. 程式人生 > >python + numpy 學習筆記 cs213n KK assignment

python + numpy 學習筆記 cs213n KK assignment

python 函式 enumerate:遍歷資料物件,返回索引,同時給出資料和資料下標
classes = [‘plane’, ‘car’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’]
for y, cls in enumerate(classes)
print(y)
print(cls)
在這裡插入圖片描述

np.flatnonzero: 返回非0下標,下標全部以一維下標進行索引
idxs = np.flatnonzero(y_train == y)
在這裡插入圖片描述

range + list 結合建立連續的索引:建立一個0到10的下標,再用這個下標去索引另一個數據
num_training = 10
mask = list(range(num_training))
print(mask)
X_train = X_train[mask]
在這裡插入圖片描述

對一個(距離)矩陣進行視覺化,來判斷某些關係
import matplotlib.pyplot as plt
plt.imshow(dists, interpolation=‘none’)

除了用format輸出資料以外,還可以使用%的方法
print('Got %d / %d correct => accuracy: %f ’ % (num_correct, num_test, accuracy))
需要有兩個百分號,一個在引號裡面,一個接著引號後面

加法:
np.sum, axis=0, axis=1 分別表示按行、按列進行加法;
keepdims在於保持維度不變,因為無論按照行還是按照列相加,都會預設損失一個維度
注意到axis的設定是僅對一個數據進行操作
比如,假設data是一個mn的矩陣,我們可以np.sum(data, axis=0),表示按照列相加,得到1

n的資料,準確的說是(n, )的資料。因此需要特別注意運算後資料維度的變化。
在這裡插入圖片描述

普通的加法,直接使用+: 也可以進行broadcast,多個數據也是可以的,以維度最高為標準。
ab = np.dot(X, self.X_train.T) # num_test * num_train
a2 = np.sum(np.square(X), axis=1).reshape(-1, 1) # num_test * 1
b2 = np.sum(np.square(self.X_train.T), axis=0).reshape(1, -1) # 1 * num_train
dists = -2 * ab + a2 + b2
可以看到這裡ab維度 是 num_test * num_train, a2維度是num_test 1, b2維度是1

num_train, 把這三者相加起來,會自動進行broadcast。 也就是把a2和ab的每一列對應元素進行相加,再將b2和上述結果的每一行對應元素相加。

確保資料是(n, )的維度: np.ravel()
這個函式確保將輸入的資料拉平,變成(n,)的資料。
有時可能因為資料維度不一致而導致錯誤,這一點需要十分注意。

將資料平均分成若干份(需要對應好原資料及其標籤),和隨機分配不一樣
np.array_split(資料, 份數)函式,將資料從中間切開,分成資料,保證資料是連續的,如將100個數據分成5份,則第一份的下標就是0到19,保證了下標的連續性。

python字典中setdefault方法
可以利用setdefault 來對鍵及其對應的值做一個初始化
dict.setdefault(key, default=None)
如果某個鍵不存在,則將其設定為這個值

如何畫出超引數的設定曲線?
可以對每一個超引數進行多次試驗,可以設定多組,然後利用鍵值對來儲存試驗結果資料。然後結合散點圖和折線圖來畫出趨勢圖,既可以看出趨勢,也可以看出每個超引數時的變化幅度。如下圖
在這裡插入圖片描述

如何劃分訓練整合為訓練集和交叉驗證集?
例子:可以將訓練集劃分為5等份,然後選取其中一個子集作為驗證集,除了這個子集之外的4等份作為訓練集。這樣共有五個驗證集的結果。