Задача : Линия наилучшего соответствия

Рейтинг: 0Ответов: 1Опубликовано: 01.03.2025

Задача:

Линией наилучшего соответствия называется прямая, проходящая на наименьшем удалении от набора из 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()

Ответы

▲ 2Принят

Здесь возвели в квадрат

sum_Ex_squared = sum(list_x)**2

А здесь ещё раз

                                                         vvvv
m = (Exy - (Ex * Ey / n)) / (Ex_squared**2 - (sum_Ex_squared**2 / )) 
                                     ^^^^^
                           А это зачем?