编程作业: Neural Network Learning
OCTAVE代码,只有计算J(θ)的值的代码,带有思考过程
%Neural Network Computation
X = [ones(m,1) X];
a= sigmoid(X * Theta1');
a= [ones(m,1) a];
H = sigmoid(a * Theta2');
%record the labels Y
T = [1:num_labels];
for i = 1 : m
Y(i,:)= (T == y(i,:));
end
%Cost Computation
J1 = (-Y.*log(H)-(1-Y).*log(1-H))/m;
J2 = ones(1,m) * J1;
J = J2 * ones(num_labels,1);
呕心沥血写出的十几行代码,简直要哭了。
思路是这样子的(自己的槽点太多):
1、神经网络的计算
X (m,n), 要在X左边加上一列1(m,1)
[1 x1 x2 x3 ……x400] * theta1 (25,401) -> a (1,25)
[1 a1 a2 …… a25]* theta2 (10,26) -> h (1,10)
X * theta1 - > H (m,10)
【因为是分类问题,所以计算结果都要加sigmoid函数】
2、y的构造
y 本来是单纯的结果序列[10,3,2.......](1,m)
但是根据CostFunction的定义,需要将其转成
使用一个for循环,进行转换.
3、Cost Function的计算
根据定义
h(x)是神经网路预测结果
H (m,10)
Y是数据中给定的结果
Y (m,10)
可以发现,其实要求的是Y.*H的结果,然后求m*10矩阵所有元素的和。
两次次求和可以看做是将(1)所有的样例内10种分类结果计算误差求和 、 (2)所有样例的误差求和
J1 = (-y.*log(o)-(1-y).*log(1-o))/m;
J2 = ones(1,m) * J1;
J = J2 * ones(num_labels,1);
【也可以写成两个sum函数的形式】