请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

*w和dot(w)

图片描述

老师,前面reshape以后是个矩阵,w是个向量, 他们之间相乘不应该用dot吗?这里为什么用 *w呢?

正在回答

插入代码

1回答

因为最后一步运算不是在做矩阵的乘法。


X 是 m * 2 的矩阵(在这个例子里,有两个特征),w 是长度为 2 的向量。

X.dot(w) 是矩阵和向量的乘法,结果是长度为 m 的向量。

X.dot(w).reshape(-1, 1) 将这个长度为 2 的向量转换成了一个矩阵,是 m * 1 的矩阵。

m * 1 的矩阵和长度为 2 的向量(w)是无法做矩阵乘法的。

这里的 X.dot(w).reshape(-1, 1) * w,是将 m * 1 的矩阵的每一行的那一个数字,去分别和 w 向量的两个数字相乘。

即:

1
2
3
4
[1]             [5, 6]
[2] * [5, 6] =  [10, 12]
[3]             [15, 18]
[4]             [20, 24]


使用一个小的测试用例试试看?


所以,X.dot(w).reshape(-1, 1) * w 的结果是 m * 2 的矩阵。


关于 numpy 中 * 和 dot 的区别,可以再回顾一下这里代码的的 [188], [189], [190]:https://git.imooc.com/coding-169/coding-169/src/master/03-Jupyter-Notebook-Numpy-and-Matplotlib/07-Computation-on-Numpy-Array/07-Computation-on-Numpy-Array.ipynb


======


具体推导参考这页 ppt:

https://img1.sycdn.imooc.com//szimg/62f365e409d9cb9518461234.jpg


X.dot(w).reshape(-1, 1) 的每一行,就是一个 ||X_project(i)||。||X_project(i)||w,相当于一个标量和向量 w 做乘法。要让 X.dot(w).reshape(-1, 1) 中的每一行的标量对应和 w 做乘法,结果形成矩阵,使用 *。


继续加油!:)


1 回复 有任何疑惑可以回复我~
  • 提问者 慕数据0441619 #1
    https://coding.imooc.com/learn/questiondetail/5BkQ4XDV70bPxad1.html  。老师,看了这个问题下你的回答,说是 矩阵*向量是 用了 numpy的一个广播机制,相当于是X2 = X - X.dot(w).reshape(-1, 1) .dot(w.reshape(1, -1))。 我觉得这个解释更清晰些。谢谢老师
    回复 有任何疑惑可以回复我~ 2022-08-10 16:11:49
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号