这几天,第二次刷完了courera的8个习题,收获还是蛮大的。
一
最先学习的就是线性回归,也是理解最透彻的一个。线性回归的根本目的就是使得样本集中尽可能多的点集中分布在所画的线上。所以先推出来一个式子就是Y = WX + b。而我们要做的就是让计算得出的Y与真实的y的差距尽可能小。所以我们引入了损失函数,为了避免正负的影响,我们使用平方项,为了求导简单,我们使用1/2的系数。那么如何优化模型呢,肯定是对系数进行调整,有那么多系数,应该如何统一进行处理呢,我们采用了梯度下降法:
最终得到模型。
当然,除了梯度下降法还有别的方法。无论如何,我们取得的都是局部最低点(损失最少)。所以我们可以直接找到导数为0的地方,这样做也是可以的,得到的结果也是对的,但要注意的就是这种方法所适用的是小规模的数据。因为大规模的矩阵计算太过麻烦,甚至可能超出内存。
二
之后学习的是逻辑回归。不同的一点就是:
其实原理相同,但现在的目的不同了。原来为了回归,而现在为的是分类。引入g的目的就是这个函数在计算的时候取值的特殊性,可以完美的通过输入的X将样本分为两类。
J也稍有不同:
但其他都和之前一样。在这个实验中,引入了惩罚
引入惩罚的最终目的就是更好的挑选有用参数。
这样在使用梯度下降法的时候就有了一点差异:
三
多分类问题和神经网络
之前的二分类问题中,y的取值为0和1.现在在多分类问题中,不过增加了y可以取得的值,剩下的什么都没有变。
之后的one VS all指的就是先将不同类的样本进行分类,然后专门针对类内部进行学习,其实就是专门针对一个类设定参数。
然后在这里接触了神经网络。
在这里的神经网络特别浅显,其实就是变相的线性回归,不过将线性回归进行了两次,正统的神经网络在下一次实验中。
四
正宗的神经网络
最重点的部分:向后传播
without regularization
with regularization
代码如下,练习了好多遍的呀:
%如果要计算J的话,需要将输入的向量y进行处理
%y的数值对应的部分为1,其他部分为0。
y_cacu=zeros(m,num_labels);
for i=1:size(y_cacu,1)
y_cacu(i,y(i))=1;
end
%现在开始复习神经网络的过程
X=[ones(m,1) X];
a1=sigmoid(X*Theta1');
a1=[ones(m,1) a1];
a2=sigmoid(a1*Theta2');
theta1_t=[zeros(size(Theta1,1),1) Theta1(:,2:end)];
theta2_t=[zeros(size(Theta2,1),1) Theta2(:,2:end)];
cost=y_cacu .* log(a2) + (1 - y_cacu) .* log(1 - a2);
cost=-sum(sum(cost))/m;
theta1_t = theta1_t.^2;
theta2_t = theta2_t.^2;
J=cost + lambda / (2 * m) *(sum(sum(theta1_t)) + sum(sum(theta2_t)));
%%=========================================================================
%%=========================================================================
%现在开始正式进行本文的运算
grad1=zeros(size(Theta1));
grad2=zeros(size(Theta2));
for i=1:m
a1=X(i,:)';%401x1
z2=Theta1*a1;%25x1
a2=sigmoid(z2);%25*1;
a2=[1;a2];%26x1
z3=Theta2*a2;%10x1
a3=sigmoid(z3);%10x1
%之后开始计算损失
%error3
error3=zeros(size(a3));
for j=1:num_labels
error3(j)=a3(j)-(y(i)==j);
end
%error2
error2=Theta2'* error3;
error2=error2(2:end,:) .* sigmoidGradient(z2);
%计算gradient
grad2 = grad2 + error3 * a2';
grad1 = grad1 + error2 * a1';
end
Theta1_temp = [zeros(size(Theta1,1),1) Theta1(:,2:end)];
Theta2_temp = [zeros(size(Theta2,1),1) Theta2(:,2:end)];
Theta1_final=grad1 / m + lambda / m * Theta1_temp;
Theta2_final=grad2 / m + lambda / m * Theta2_temp;
grad = [Theta1_final(:) ; Theta2_final(:)];
看着自己写的代码,超级自豪,超级骄傲。
五
使用极差和方差对正规化的线性模型进行调整和优化
在这里加入了验证集。
第一部分就是不断加入样本,进行训练,然后测量训练集和验证集的误差。
最后会得出这样的图形:
之后进行了Polynomial regression,说白了就是不管以x的每一个属性为一个维度,而是对属性进行k次方的运算,然后再构建模型。
在这里需要学到的东西还不是很多,有点东西有一点涉及,等到后面详细展开讲。
六
最让人头疼的SVM。练习本身并不难,但算法的真正思想却并不简单。
SVM最直观的目的就是分类。对于分类已经有逻辑回归了。那要SVM干什么,就是为了处理复杂的情况。这么说可能很不准确,但的确SVM可以处理很多很复杂的情况。SVM是一个large margin classifier。
这是在知乎上找到的区别,原网址为点击打开链接
其实最直观的不同就是一个有margin,所以受到个别数据的影响小,一个没有margin,所以受到的影响大
损失函数不用,所以所做的trade off不同。
要说明一下参数的选择:
C增大,lambda减小,偏差(bias降低),variance(方差)增大
arfa方增大,图像变扁平,容易过拟合
七
聚类和PCA,感觉后面的都是大头啊啊啊啊
聚类比较简单,我也理解的比较透彻
寻找中心点:
重新确定一个类的中心点坐标:
之后就是PCA,其实就是用一个低维矩阵左乘样本矩阵,获得的结果除了对角线元素尽量为0(各个维度不相关),按照对角线元素从大到小排列,找出前K列最大的,就是得到的降低到为K维基向量。
之后的具体操作,都在exercise7这篇blog中了,不再赘述。
八
之后就是对于大数据的一个初步入门了。在这个实验中,就是首先计算了均值和标准差,之后利用查全率,查准率,F1找到最好阈值,最后对用户,属性求导,求损失,就完事了。但这个事情本身还是比较复杂的,需要再进一步学习。
以上,就是我做完的全部练习题。