今天做吴恩达机器学习的课程作业ex2时,发现了自己之前一直忽略了一个非常重要的基础知识:MATLAB的点除运算。
点除运算当然要从MATLAB独特的“数组运算”讲起,也就是MATLAB在正常的矩阵运算(加、减、数乘、矩阵乘法)之外,为了方便运算又定义的一套“数组运算”规则。非常典型的就是我们常见的点乘“.*”和点除“./”了,详细的使用方法及与“/”和“*”的区别见matlab中乘法“*”和点乘“.*”;除法“/”和点除“./”的联系和区别。
而我今天在实现sigmoid函数时,非常天真地直接这样写:
function g = sigmoid(z) g = 1 /(1 + exp(-z)); end
然后在计算Cost Function时就遇到了矩阵乘法维度不一致的错误,而我还天真地以为自己没错。。。
正如上面链接中的文章提到:
数值和矩阵进行除法运算时,要分数值在前还是在后。
(1),数值在前,只能用./
(2),数值在后,这两种一样:A/b = A./b
所以应该是:
function g = sigmoid(z) g = 1 ./(1 + exp(-z)); end