前提
先日teratailでヒストグラムのガウシアンフィッティングに関する質問をさせていただきました。scipy.optimize.curve_fitの機能であるwight(重み)を用いたフィッティングを用いた結果として困っていた複数ピークの同時フィッティングができるようになりました。
しかし、複数を同時にフィッティングすることで、高さが合わないという問題が発生しました。以下の図で示します。
原因として、重みをかけたことにより引っ張られてしまっているのではないかと考えています。
実現したいこと
高さが変わることでσなどのパラメータ、この関数の積分結果に影響を及ぼすため、解決したい。
別のデータですが、これが理想です。
発生している問題・エラーメッセージ
特になし
該当のソースコード
python
1from pylab import * 2from scipy.optimize import curve_fit 3import pandas as pd 4import matplotlib.pyplot as plt 5import numpy as np 6 7#csvファイルの読み込み 8data = pd.read_csv("C:/Users/rine/Desktop/CR-39_analysis/TD531/back/Minor.csv") 9#histの条件 alphaはグラフの透明性 10y,x,_ = plt.hist(data,bins=[i*0.48 for i in range(100)],alpha=.3,label='data',ec='black') 11plt.xlim(0,48) 12#plt.ylim(0,400) 13 14x = (x[1:]+x[:-1])/2 # for len(x)==len(y) 15 16def gauss(x,mu,sigma,A): 17 return A*np.exp(-(x-mu)**2/(2*sigma**2)) 18 19def bimodal(x,mu1,sigma1,A1,mu2,sigma2,A2,mu3,sigma3,A3,mu4,sigma4,A4): 20 return gauss(x,mu1,sigma1,A1)+gauss(x,mu2,sigma2,A2)+gauss(x,mu3,sigma3,A3)+gauss(x,mu4,sigma4,A4) 21 22expected = (13.7,2.87,87, 22.4,1.43,102, 28.5,1.41,367, 33.3,0.48,12000) 23params,cov = curve_fit(bimodal,x,y,expected) 24sigma = sqrt(diag(cov)) 25plt.plot(x, bimodal(x,*params), color='red', lw=3, label='fitting') 26plt.legend() 27plt.show() 28print(params,'\n',sigma) 29 30 31w = np.ones(len(x)) 32w[52:60] = 0.25 # 重みの設定(数値を小さく) 33params, cov = curve_fit(bimodal, x, y, expected, sigma = w) 34 35#print(x[52:60])#重みをかける位置の確認 36y,x,_ = plt.hist(data,bins=[i*0.48 for i in range(100)],alpha=.3,label='data',ec='black') 37plt.xlim(0,48) 38#plt.ylim(0,400) 39#plt.ylim(8000,12000) 40 41plt.plot(x, bimodal(x,*params), color='black', lw = 3, label = 'fitting') 42plt.show() 43print(params, '\n', sigma)
試したこと
重みをつける部分の確認及び変更(複数パターンで確認済み)
curve_fit以外のモジュール(GMM)などを試しましたが、いまだうまくいっていません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー