簡體   English   中英

scipy.optimize.fmin錯誤:使用序列設置數組元素

[英]scipy.optimize.fmin error: setting an array element with a sequence

我試圖通過找到誤差值最低的參數來擬合sin函數。

下面是我的代碼:

import numpy as np
import scipy.optimize as opt
from scipy.optimize import leastsq
import matplotlib.pyplot as plt

def func_model(x, para):
    ''' Model: y = a*sin(2*k*pi*x+theta)'''
    a, k, theta = para
    return a*np.sin(2*k*np.pi*x+theta)

def func_noise(x, para):
    a, k, theta = para
    return a*np.sin(2*k*np.pi*x+theta) + np.random.randn(100)

def func_error(para_guess):
    '''error_func'''
    error_sum = 0
    x_seq = np.linspace(-2*np.pi, 0, 100)
    para_fact = [10, 0.34, np.pi/6]
    for x in x_seq:
        error_value = (func_noise(x, para_fact)-func_model(x, para_guess))**2
        error_sum = error_sum + error_value
    return error_sum

para_guess_init = np.array([7, 0.2, 0])
solution = opt.fmin(func_error, para_guess_init) 
print(solution)

但這是行不通的,並說了錯誤:用序列設置數組

追溯:

  File "", line 26, in <module>
    solution = opt.fmin(func_error, para_guess_init)
  File "C:\Users\sun\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\optimize\optimize.py", line 408, in fmin
    res = _minimize_neldermead(func, x0, args, callback=callback, **opts)
  File "C:\Users\sun\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\optimize\optimize.py", line 532, in _minimize_neldermead
    fsim[k] = func(sim[k])
ValueError: setting an array element with a sequence.

有人可以幫我嗎,謝謝

該最小化器期望標量函數求值最小化。

您的函數func_error返回大小為(100,)的向量。

比較您的行:

error_value = (func_noise(x, para_fact)-func_model(x, para_guess))**2

例如:

error_value = np.sum(np.square(
                               func_noise(x, para_fact)-func_model(x, para_guess)))

盡管我希望(客觀更改!):

error_value = np.linalg.norm(
                             func_noise(x, para_fact)-func_model(x, para_guess))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM