Реализация бесконечной матричной формулы на python для подбора кривой - PullRequest
1 голос
/ 09 мая 2020

Я пытаюсь написать программу, которая может решить общую формулу регрессии: Итак, я пытаюсь реализовать это матричное уравнение , есть ли способ сделать это, например, чтобы пользователь мог решить, как он может быть большим, если я не буду создавать все больше и больше условий if (так что всего один фрагмент кода, который сворачивается в матрицу, которую желает пользователь)? Код:

    #Solving the general matrix for the coefficients
if 3 == n:
    a = np.array([[np.sum(np.multiply(FL[1],FL[1])),np.sum(np.multiply(FL[1],FL[2]))],
                    [np.sum(np.multiply(FL[1],FL[2])),np.sum(np.multiply(FL[2],FL[2]))]])
    b = np.array([np.sum(np.multiply(FL[0],FL[1])),np.sum(np.multiply(FL[0],FL[2]))])
    x = np.linalg.solve(a, b)
if 4 == n:
    a = np.array([[np.sum(np.multiply(FL[1],FL[1])),np.sum(np.multiply(FL[1],FL[2])),np.sum(np.multiply(FL[1],FL[3]))],
                    [np.sum(np.multiply(FL[1],FL[2])),np.sum(np.multiply(FL[2],FL[2])),np.sum(np.multiply(FL[2],FL[3]))],
                    [np.sum(np.multiply(FL[1],FL[3])),np.sum(np.multiply(FL[2],FL[3])),np.sum(np.multiply(FL[3],FL[3]))]])
    b = np.array([np.sum(np.multiply(FL[0],FL[1])),np.sum(np.multiply(FL[0],FL[2])),np.sum(np.multiply(FL[0],FL[3]))])
    x = np.linalg.solve(a, b)

1 В этом коде Phi_0 соответствует FL [i = 1], а FL [0] соответствует y.

1 Ответ

1 голос
/ 10 мая 2020

Вы можете сделать алгоритм независимым от порядка полинома. Самый простой способ - использовать for циклы, хотя они будут медленными (поскольку они не используют векторизацию NumPy).
Вот воспроизводимый пример со случайными данными:

import numpy as np
# Order of polynomial
n = 5
# Random seed for reproducibility
np.random.seed(1)
# Input arrays
phi = np.random.random((100,n))
y = np.random.random(100)
# Output arrays
a = np.zeros((n,n))
b = np.zeros(n)
for i in range(n):
    b[i] = np.sum(y * phi[:,i])
    for j in range(i,n):
        # Exploit that matrix is diagonal
        a[i,j] = a[j,i] = np.sum(phi[:,i] * phi[:,j])
# Coefficients array
x = np.linalg.solve(a,b)
...