python - 不同维度矩阵的二项式公式实现
问题描述
我正在尝试为维度为 n 2 的两个矩阵 x 和维度为 m 2 的 y实现 (xy)^2 。我认为要解决它,我们可以应用二项式公式 (xy)^2 = x^2-2x.T y+y^2=xT x-2x.T y+yT y。
我的初稿如下:
tmp1 = numpy.square(input1)
tmp2 = numpy.square(input2)
res = numpy.dot(input1, input2.T)
res *= -2
res += temp1.reshape(-1, 1)
res += temp2
return np.exp(res)
不幸的是,经过数小时的尝试,我的时间变量的维度仍然存在问题。如果能进一步帮助如何为不同大小的矩阵编写二项式公式,那就太好了。非常感谢!
解决方案
假设您的意思是x
并且y
是两个具有不同维度的一维数组,并且您想要它们outer
差异的平方:
In [98]: x = np.arange(1,5); y = np.arange(5,8); x,y
Out[98]: (array([1, 2, 3, 4]), array([5, 6, 7]))
您(x-y)^2
可以通过以下方式轻松完成broadcasting
:
In [99]: (x[:,None]-y)**2
Out[99]:
array([[16, 25, 36],
[ 9, 16, 25],
[ 4, 9, 16],
[ 1, 4, 9]])
或者,如果我们制作:
In [100]: x1 = x[:,None] # (4,1) shape
In [101]: (x1-y)**2
Out[101]:
array([[16, 25, 36],
[ 9, 16, 25],
[ 4, 9, 16],
[ 1, 4, 9]])
那么你的二项式公式是:
In [103]: x1**2 - 2*x1*y+y**2
Out[103]:
array([[16, 25, 36],
[ 9, 16, 25],
[ 4, 9, 16],
[ 1, 4, 9]])
x
是 1d,所以x.T
不会改变任何东西。我认为您的目标是将(1,4)转换为(4,1)。
如果数组不同,比如 2d,你需要给出一个清晰的例子。
如果数组是“行向量”,则它们是等效的:
In [105]: x.shape, y.shape
Out[105]: ((1, 4), (1, 3))
In [106]: (x.T-y)**2
...
In [107]: x.T**2 - 2*x.T*y + y**2
编辑
寻找“二项式论坛矩阵”,我发现:
https://math.stackexchange.com/questions/2754278/binomial-formula-for-matrices
这谈论了很多关于矩阵是否是可交换的,等等。
我展示的是如何将基本的标量二项式公式逐元素应用于数组。(m,) 和 (n,) 形状的数组(有效地)扩展为 (m,n),并且按元素应用公式。基本运算符 '+-*' 都按元素应用,并使用broadcasting
.
您的问题和评论中不清楚的是什么x^2
,x.Tx
以及x.Ty
何时x
和y
是 2d。哪些是矩阵乘法,用numpy
( np.dot
)@
写成np.matmul
?
矩阵乘法对维度如何组合有特定的规则。A (3,2) @ (2,4) => (3,4),而 (2,4) @ (3,2) 会产生错误。
并且 (3,2) 不能与 (4,2) 为 +/-。可以扩展维度并产生(3,4,2)“外部”和或差。
推荐阅读
- sql - 如何在视图中的 CASE 语句中运行存储过程或函数?
- java - 滚动到不在屏幕上且具有共享对象 ID 但具有唯一用户确定文本的元素(Android / Java)
- c# - MVC Razor Html 表单验证未捕获错误
- excel - 如何在多个条件下在excel中获得sumproduct
- php - 如何在 php 中构建电子商务
- java - 使用 DropWizard 对 JAX-RS 端点执行单元测试时无法挂起异步请求的连接
- xml - 使用 XPath 从 XML 读取多个值
- python - 在 C++ 程序中调用 Cython (Python3.6)
- r - R中的错误:无法找到函数'dbWriteTable'的继承方法
- scala - 迭代 RDD 迭代器并应用限制时,Spark 似乎没有调用 hasNext