来自两个阵列的最小二乘最佳拟合线的斜率m

时间:2019-09-25 00:19:49

标签: python subroutine

给出两个文本文件以及分别作为数组的“ x”和“ y”,编写一个子程序,该子程序将给出斜率“ m”并截取最小二乘最佳拟合线的“ b”。

  

x = 1,2,3,4

     

y = 5,6,7,8

     

m =((sum(xy)-sum(x)ybar)/(((sumx ^ 2)-(sum(x)xbar))

     

b = ybar-m(xbar)。

     

xbar和ybar是x和y数组的平均值。

我的老师说我们不能使用np.loadtxt以外的内在python函数。

除了定义4个数组组合,然后是4个组合的每一个的总和,然后找到m之外,我正在尝试找到一种更有效的方法。

我试图将数组组合的每个和定义为嵌套循环。

import numpy as np

x = np.loadtxt("C:/Users/Bob/Documents/School/Comp Phys/xlsf.dat")
y = np.loadtxt("C:/Users/Bob/Documents/School/Comp Phys/ylsf.dat")

xbar = np.mean(x)
ybar = np.mean(y)

nx = len(x)
ny = len(y)

q = print(xbar)

sum1=[[0 for i in range(nx)] for j in range(ny)]

for i in range (0, nx):
    for j in range (0, ny):
        sum1[i][j] = x[i] * y[j]

for i in range (ny):
        for j in range (nx):
            ((sum1[i][j]))

sum2=[[0 for q in range(nx)] for r in range(ybar)]

for q in range (0, nx):
    for r in range (0, ybar):
        sum2[q][r] = x[q] * ybar[r]

for q in range (ybar):
    for r in range (nx):
        ((sum2[q][r]))

Python陷入了sum2部分,并出现以下错误:

  

sum2 = [[0表示范围(nx)中的q],r表示范围(ybar)中的r]

     
    

TypeError:“ numpy.float64”对象无法解释为整数。

  

1 个答案:

答案 0 :(得分:1)

xbar = np.mean(x)
ybar = np.mean(y)

在您的代码中,xbar和ybar是数组的均值,以浮点数(numpy类型float 64)给出。

在下面的行中,将for循环使用range(ybar)。

sum2=[[0 for q in range(nx)] for r in range(ybar)]

for q in range (0, nx):
    for r in range (0, ybar):
        sum2[q][r] = x[q] * ybar[r]

for q in range (ybar):
    for r in range (nx):
        ((sum2[q][r]))

但是,您的for循环不能使用非整数循环,因为它们不能循环(例如4.5次)。您可能需要构建代码以不同的方式计算总和,例如使用不同的变量作为循环范围。

我仍然不确定您要尝试进行哪些计算,但是我已经构造了以下代码,您可以通过这些代码。它很简单,可以按原样执行每个步骤,因此您可以优化代码本身以使其运行得更好,但是希望它将为您提供有关如何构建计算的想法。

# sum1 array, x*y
sum1=[[0 for i in range(nx)] for j in range(ny)]
for i in range (0, nx):
    for j in range (0, ny):
        sum1[i][j] = x[i] * y[j]

# sum2 array, x
# notice that the array sum2 can just be completely replaced by x[]
sum2=[[0 for q in range(nx)] for r in range(ny)]
for q in range (0, nx):
        sum2[q][0] = x[q] 

# sum3 array, x^2
# same for sum3, we can just replace it with x[]*x[]
sum3 = [[0 for q in range(nx)] for r in range(ny)]
for q in range (0, nx):
        sum2[q][0] = x[q]*x[q]

term1 = 0
term2 = 0
term3 = 0
term4 = 0

# sum each 'sum array' and apply them to the term variables
for i in range(nx):
    for j in range(ny):
        term1 += sum1
        term2 += sum2
        term3 += sum3
        term4 += sum2

term2 = term2 * ybar // we multiply that sum by the coefficients 
term4 = term4 * xbar

m = (term1 - term2 ) / (term3 - term4 ) // calculate m
b = ybar - m * xbar // calculate b