*w和dot(w)

来源:7-4 求数据的前n个主成分

慕数据0441619

2022-08-10

图片描述

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

写回答

1回答

liuyubobobo

2022-08-10

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


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]             [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:

//img.mukewang.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
1
慕数据0441619
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
共1条回复

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5839 学习 · 2437 问题

查看课程