1.KNN
遇到的问题
本质上都可以通过自己写循环解决,不过使用numpy会方便很多。
-
numpy中如何用数组索引数组?
只要两个元素都是numpy.array类型的就可以用过[ ]直接索引。
-
如何统计数组中各个元素出现的次数?
使用np.bincount方法,不过需要注意数组元素都需要大于0。
-
不使用循环来计算测试集的每个元素与训练集的每个元素的l2值
$(x_1 - x_2)^2 = x_1^2 - 2x_1x_2 + x_2^2$,分别计算这三项就可以,这个思想很好。
获得经验
-
python中用*接收元组,**接收字典。
-
交叉验证时做数据划分
设原始数据为X_train,标签为y_train
-
第一种方法:用 np.array_split方法
1 2 3 4 5 6 7
X_train_folds = np.array_split(X_train, num_folds) y_train_folds = np.array_split(y_train, num_folds) # 得到第j折数据 cv_X_train = np.hstack(X_train_folds[0:j] + X_train_folds[j+1:]) cv_X_test = X_train_folds[j] cv_y_train = np.hstack(y_train_folds[0:j] + y_train_folds[j+1:]) cv_y_test = y_train_folds[j]
-
第二种方法:用range做mask
1 2 3 4 5 6 7 8 9 10 11 12
num_training = 49000 num_validation = 1000 num_test = 1000 mask = range(num_training, num_training+num_validation) X_val = X_train[mask] y_val = y_train[mask] mask = range(num_training) X_train = X_train[mask] # 注意到这里把原始训练集覆盖了,不过后面要用的就是现在的训练集,所 # 以没关系 y_train = y_train[mask]
-
-
通过字典来计算平均值、标准差,用来画errorbar
1 2 3
# x为一字典 [np.mean(v) for k, v in sorted(x.items())] [np.std(v) for k, v in sorted(x.items())]
2.SVM
获得经验
- numpy二维数组使用列索引,取所有行的操作不能用slice操作 :,要有一个所有行号的显示表达才能使用列所有,实验中采用的range做行索引去取得所有行。
- 查找数组或矩阵符合条件元素的下标,用np.where(xxx)[1]
3.Softmax
获得经验
-
由于$\frac{e^{f_{y_i}}}{\sum_j e^{f_j}}$存在指数操作,我们可以把计算出来的所有$f$值减去$f$中最大的值,这样所得的$f$值均为负数,不会上溢。
-
$L_i = -\log \frac{e^{f_{y_i}}}{\sum_j e^{f_j}}$ , 梯度计算:$\frac{\partial L_i}{\partial f_k} = P_k - \mathcal{I}(k =y_i)$
-
变量名一定要有意义,不然很容易出错