*w和dot(w)
来源:7-4 求数据的前n个主成分
慕数据0441619
2022-08-10
老师,前面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] [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:
X.dot(w).reshape(-1, 1) 的每一行,就是一个 ||X_project(i)||。||X_project(i)||w,相当于一个标量和向量 w 做乘法。要让 X.dot(w).reshape(-1, 1) 中的每一行的标量对应和 w 做乘法,结果形成矩阵,使用 *。
继续加油!:)
112022-08-10
相似问题