将我的代码打包到类中时遇到一些问题

问题描述 投票:0回答:1

我的代码:

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

问题:除了

def run
之外,所有def都可以独立工作。有人可以帮我解决一下吗?

python class scipy-optimize-minimize
1个回答
0
投票

我修好了,这是我的代码:

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()enter code here
print(least_squares.run(y, x))

我对格式感到抱歉,我是第一个使用堆栈溢出来提问和回答问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.