1

seaborn のヒストグラム値に正規分布を当てはめようとしています。次のコードを使用しています。

from scipy.optimize import least_squares
from math import exp


def model_normal_dist(x, u):
    return x[0]*exp(-((x[1]-u)/x[2])**2)

def model_residual(x,u,y):
    print(model_normal_dist(x, u) - y)
    return model_normal_dist(x, u) - y

u=np.array([h.xy[0]+.5*h.get_width() for h in sns.histplot(data=data,x='visitor_prop1').patches])
y=np.array([h.get_height() for h in  sns.histplot(data=data,x='visitor_prop1').patches])
x=np.array([10000,.2,1])


res_1 = least_squares(model_residual, x, args=(u, y), verbose=1)

ここで、data は float 値の列「visitor_prop1」を持つデータフレームです。これを実行すると、TypeError: only size-1 arrays can be converted to Python scalars. 上記の関数にprintステートメントを入れてみましたが、明らかに実行されません。

u と y が float の配列であることを確認しました。そのサンプルは次のとおりです。

print(u[0:30])
print(y[0:30])

[0.00109038 0.00327085 0.00545132 0.00763179 0.00981227 0.01199274
 0.01417321 0.01635368 0.01853415 0.02071462 0.02289509 0.02507556
 0.02725603 0.0294365  0.03161697 0.03379744 0.03597791 0.03815838
 0.04033886 0.04251933 0.0446998  0.04688027 0.04906074 0.05124121
 0.05342168 0.05560215 0.05778262 0.05996309 0.06214356 0.06432403]
[ 704.  658.  757.  754.  848.  920.  924.  980. 1048. 1124. 1134. 1300.
 1343. 1420. 1516. 1593. 1689. 1752. 1821. 1970. 1997. 2142. 2162. 2234.
 2409. 2602. 2624. 2715. 2914. 2927.]

Python スカラーのように見えるtype(model_residual(x,u[5],y[5]))戻り値を確認しました。このエラーの原因は何ですか?numpy.float64

4

1 に答える 1

2

このエラーは、スカラーのみで動作する math.exp() が原因でした。scipy.optimize.least_squares は配列を操作できる必要があります。解決策は、math.exp() を numpy.exp() に交換することです。

def model_normal_dist(x, u):
    return x[0]*np.exp(-((x[1]-u)/x[2])**2)

または、関数をそのままにして、インポートを変更します。

from numpy import exp

印刷するために評価する必要のある関数にエラーがあったため、印刷ステートメントを実行できませんでした。

于 2021-03-21T18:51:31.373 に答える