Задача : Линия наилучшего соответствия
Задача:
Линией наилучшего соответствия называется прямая, проходящая на
наименьшем удалении от набора из n точек. В данном упражнении мы
предположим, что каждая точка в коллекции обладает координатами x
и y. Символы и мы будем использовать для подсчета средних значений по осям x и y соответственно. Линия наилучшего соответствия
представлена формулой y = mx + b, где m и b вычисляются по следующим
формулам:
Напишите программу, которая будет запрашивать у пользователя координаты коллекции точек. При этом пользователь должен вводить сначала координату x, а затем y. Ввод координат может продолжаться до тех пор, пока пользователь не оставит пустым ввод координаты x. Отобразите формулу, характеризующую линию наилучшего соответствия, вида y = mx + b путем замены переменных m и 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()
Ответы (1 шт):
Здесь возвели в квадрат
sum_Ex_squared = sum(list_x)**2
А здесь ещё раз
vvvv
m = (Exy - (Ex * Ey / n)) / (Ex_squared**2 - (sum_Ex_squared**2 / ))
^^^^^
А это зачем?