Some problem in package my code into class

53 Views Asked by At

My code:

from scipy.optimize import minimize
import numpy as np

class Least_squares:
    def __init__(self):
        self.d = 2           #decision_demension
        self.parameter_sets = np.ones(6)       #Parameters_sets = 1+1 +d+ d (alpha+ beta_0 +...+...)

    def func(self,x):
        parameter_sets= self.parameter_sets
        alpha = parameter_sets[0]
        Phi = parameter_sets[1]
        T = 1
        for i in range(2, self.d + 2):
            Phi += x[:, i - 2] * parameter_sets[i]
        for j in range(self.d + 2, len(parameter_sets)):
            Phi += x[:, j - self.d - 2] * x[:, j - self.d - 2] * parameter_sets[j]

        Phi += alpha * T


        return Phi

    def Euclidean_distance(self,a, b):
        dis = 0
        for i in range(self.d):
            dis += (a[i] - b[i]) ** 2
        return dis ** 0.5

    def residuals(self, y, x):
        parameter_sets = self.parameter_sets
        alpha = parameter_sets[0]
        mu_0 = 1
        residu = 0
        transfer = (y - self.func(x))

        for i in range(x.shape[1]):

            residu += (transfer[i] / (1 + self.Euclidean_distance(x[i, :], x[-1, :]))) ** 2

        for j in range(1, len(parameter_sets)):
            residu += (mu_0 * parameter_sets[j]) ** 2
        residu += (mu_0 * (alpha - 1)) ** 2

        return residu

    def run(self,y,x):
        plsq = minimize(self.residuals, self.parameter_sets ,args=(y, x))
        return plsq.x

x = np.array([[0.1,0.2],[0.3,0.4],[0.4, 0.5],[0.6, 0.7],[0.8,0.9],[0.9,1],[1,1.1]])
y = np.array([1,2,3,4,5,6,7])
least_squares =  Least_squares()
print(least_squares.run(y,x))
Error:TypeError: residuals() takes 3 positional arguments but 4 were given

Question: All the def can work independently except run. Can someone help me to figure it out?

1

There are 1 best solutions below

1
Le Xu On

I fixed it. This is my code below:

from scipy.optimize import minimize
import numpy as np


class Least_squares:
    def __init__(self):
        self.d = 2           # decision_demension
        self.parameter_sets = np.ones(6)

    def func(self, x, parameter_sets):
        alpha = parameter_sets[0]
        Phi = parameter_sets[1]
        T = 1
        for i in range(2, self.d + 2):
            Phi += x[:, i - 2]*parameter_sets[i]
        for j in range(self.d + 2, len(parameter_sets)):
            Phi += x[:, j - self.d - 2]*x[:, j - self.d - 2]*parameter_sets[j]

        Phi += alpha * T

        return Phi

    def Euclidean_distance(self, a, b):
        dis = 0
        for i in range(self.d):
            dis += (a[i] - b[i])**2
        return dis ** 0.5

    def residuals(self, parameter_sets, y, x):
        alpha = parameter_sets[0]
        mu_0 = 1
        residu = 0
        transfer = (y - self.func(x, parameter_sets))

        for i in range(x.shape[0]):  # Fix: iterate over rows, not columns
            residu += (transfer[i]/(1 + self.Euclidean_distance(x[i, :], x[-1, :])))**2

        for j in range(1, len(parameter_sets)):
            residu += (mu_0 * parameter_sets[j])**2
        residu += (mu_0 * (alpha - 1))**2

        return residu

    def run(self, y, x):
        plsq = minimize(self.residuals, self.parameter_sets, args=(y, x), method='BFGS')
        return plsq.x


x = np.array([[0.1, 0.2],
              [0.3, 0.4],
              [0.4, 0.5],
              [0.6, 0.7],
              [0.8, 0.9],
              [0.9, 1],
              [1, 1.1]])
y = np.array([1, 2, 3, 4, 5, 6, 7])
least_squares = Least_squares()
print(least_squares.run(y, x))