点积Numpy为什么不能得到标量?

2024-06-28 19:35:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难理解为什么Numpy中的点积不会返回标量。我尝试使用以下代码分析计算线性回归的系数:

import numpy as np

# Here the function is defined
def linfit(xdat,ydat):
    # Here xbar and ybar (the averages) are calculated
    xbar = np.sum(xdat)/len(xdat)
    ybar = np.sum(ydat)/len(ydat)

    # Insert calculation of m and c here. 
    diffx = xdat - xbar
    m = np.dot(diffx, ydat) / diffx**2
    c = ybar - m * xbar

    # Return your values as [m, c]
    return [m, c]

例如,我使用以下xdat和ydat:

xdat = np.array([[1],
                 [2],
                 [3],
                 [4]])
ydat = np.array([[2],
                 [4],
                 [3],
                 [5]])

diffx生成以下4x1矩阵:

array([[-1.5],
       [-0.5],
       [ 0.5],
       [ 1.5]])

xbar和ybar的结果分别为2.5和3.5

我遇到的问题是如何计算m。更具体地说,计算diffx和ydat的点积,这也是一个4x1矩阵

我期望的结果是一个标量,但我尝试的每种方法都无法返回:

1-m = np.dot(diffx, ydat)返回值错误:形状(4,1)和(4,1)未对齐:1(尺寸1)!=4(0)。我理解维度的问题,但为什么下面的方法有效?(返回3):

x = [1, 3, -5]
y = [4, -2, -1]
dot = np.dot(x, y)
print(dot)

2-我尝试转置ydat,得到一个4x4矩阵:

m = np.dot(diffx, ydat.T)
[[-3.  -6.  -4.5 -7.5]
[-1.  -2.  -1.5 -2.5]
[ 1.   2.   1.5  2.5]
[ 3.   6.   4.5  7.5]]

3-我尝试了m = diffx*ydat并得到:

[[-3. ]
[-2. ]
[ 1.5]
[ 7.5]]

4-我尝试了m = diffx @ ydat并获取了值错误:matmul:输入操作数1的核心维度0不匹配,具有gufunc签名(n?,k),(k,m?->;(n?,m?)(尺寸4不同于1)

5-我尝试了m = diffx @ ydat.T再次得到了一个4x4矩阵

唯一有效的方法是m = sum(diffx * ydat),但Numpy根本不会给我答案。我想我遗漏了一些关于线性代数或Numpy的概念

非常感谢您的帮助


Tags: 方法numpyhereasnp矩阵arraydot