任务:
最佳拟合线是经过一组 n 个点的距离最短的线。在这个练习中,我们将假设集合中的每个点都有 x 和 y 坐标。我们将使用符号和分别计算 x 和 y 轴上的平均值。最佳拟合线用公式 y = mx + b 表示,其中 m 和 b 使用以下公式计算:
编写一个程序,提示用户输入一组点的坐标。在这种情况下,用户必须先输入 x 坐标,然后输入 y 坐标。坐标输入可持续进行,直到用户将 x 坐标输入留空。通过使用前面的公式计算出的值替换变量 m 和 b,显示表征最佳拟合线的公式,形式为 y = mx + b。例如,如果用户输入三个点 (1, 1)、(2, 2.1) 和 (3, 2.9),则得到的公式应为 y = 0.95x + 0.1。
输出时,我的代码给出了不正确的值。我不知道为什么。
def line_of_best_fit(list_x, list_y):
#Находим Exy - сумму произведений точек x и y
Exy = 0
for x in range(len(list_x)):
Exy += list_x[x] * list_y[x]
#находим Ex и Ey - сумма значений x и y
Ex = sum(list_x)
Ey = sum(list_y)
#находим n
n = len(list_x)
#находим среднее значение точек x и y
middle_y = Ey / n
middle_x = Ex / n
#Находим Ex_squared - сумма квадратов каждого элемента и sum_Ex_squared - сумма всех элементов возведенная в квадрат
Ex_squared = 0
for x in range(len(list_x)):
Ex_squared += list_x[x]**2
sum_Ex_squared = Ex**2
sum_Ey_squred = Ey**2
#находим m и b
m = (Exy - ((Ex * Ey) / n)) / (Ex_squared - (sum_Ex_squared / n))
b = middle_y - (m * middle_x)
return print(f'y = {round(m,2)}x + {round(b,2)}')
def main():
list_x = []
list_y = []
part_x = int(input('Введите значение X: '))
while part_x != '':
list_x.append(float(part_x))
part_y = input('Введите значение Y: ')
list_y.append(float(part_y))
part_x = input('Введите значение X: (для выхода введите пустую строку) ')
line_of_best_fit(list_x,list_y)
if __name__ == '__main__':
main()
他们在这里把它平方了
再次