質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

受付中

1次元混合ガウスモデルのプログラムの出力値がわからない

ygtygtygt
ygtygtygt

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0回答

0評価

0クリップ

3閲覧

投稿2020/01/24 17:16

編集2022/01/12 10:55

夜分投稿失礼いたします。
以下のプログラムは1次元の混合ガウスモデルのプログラムです。
何個のガウス分布を重ね合わせるのが最適かをBICというもので計算しています。

混合ガウスモデルのアルゴリズムは理解しているのですがこのプログラムの出力値が何を示しているか自分の知識不足のせいでわかりません。
自分で考えた中では入力データの負担率だと思うのですがあってますか?
負担率とは、あるデータxにおいて、k番目のクラスの正規分布からの観測される確率のことです。別の言い方をすると、あるデータxにおける混合正規分布の割合とも考えられそうです。

3つのクラスA,B,Cに分かれると想定した場合1つのデータを入力すると
[クラスAに属する確率,クラスBに属する確率,クラスCに属する確率] = [0.5, 0.3, 0.2]

加えて負担率はクラスごとに計算されるものだと思うのですがこのプログラムで負担率はクラスごとに計算されますか?

このプログラムでは入力データが100個なのですがいずれは30個で行いたいと思ってます。
ちなみに16個のデータを入力したら重ね合わせる最適なガウス分布の個数は1で出力データは入力データの個数と同じ個数出てきました。

入力データ:
[1,2,2,1,2,1,2,3,3,1,2,2,3,4,1,1]

出力データ:
[0.00979, 0.19649, 0.19649, 0.00979, 0.19649, 0.00979, 0.19649, 0.96889, 0.96889, 0.00979, 0.19649, 0.19649, 0.96889, 0.99995, 0.00979, 0.00979]

python ``` コード ``` import numpy as np from scipy.optimize import leastsq import matplotlib.pyplot as plt from tqdm import tqdm import math import csv """Setting up test data""" def gaussian_func(x, A, mu, sigma): return A * np.exp( - (x - mu)**2 / (2 * sigma**2)) num_peak_true = 3 A = np.array([0.8, 1, 0.5]) #np.random.rand(num_peak) mu = np.array([0.2, 0.4, 0.8]) sigma = np.array([0.05, 0.05, 0.03]) #sample.csvの3列目の値を取得 list = [] with open('data/src/sample.csv') as f:#ファイル名は架空のものを記載 reader = csv.reader(f) for row in reader: list.append(row[2]) float = float(list)#文字列をfloat型に変換 x = np.array(list)#numpy型に変換 xは入力したデータ y_true = np.random.normal(0.5, 0.05, len(x)) for i in range(num_peak_true): y_true += gaussian_func(x, A[i], mu[i], sigma[i]) """Solving""" max_num_peak = 6 max_iter = 100 bic = 1e5 bic_arr = np.zeros(max_num_peak) for num_peak in range(1, max_num_peak+1): def residual(p, y, x): y_fit = p[0] for i in range(num_peak): y_fit += gaussian_func(x, p[3*i+1], p[3*i+2], p[3*(i+1)]) error = y - y_fit return error sse = 1e5 # set initial loss large num_param = num_peak*3 + 1 for i in tqdm(range(max_iter)): p = np.random.rand(num_param) # initial guesses for leastsq plsq, ier = leastsq(residual, p, args = (y_true, x)) sse_i = np.sum(residual(plsq, y_true, x)**2) if sse_i < sse: sse = sse_i plsq_opt = plsq #BIC = n* ln(sse/n) + k*ln(n) bic_i = num_sample*math.log(sse/num_sample) + num_param*math.log(num_sample) print("num of peak: ", num_peak, "BIC:", bic_i) bic_arr[num_peak-1] = bic_i if bic_i < bic: bic = bic_i num_peak_estimated = num_peak plsq_global_opt = plsq_opt """plot results""" y_estimated = plsq_global_opt[0] for i in range(num_peak_estimated): y_estimated += gaussian_func(x, plsq_global_opt[3*i+1], plsq_global_opt[3*i+2],plsq_global_opt[3*(i+1)]) #出力データ print(y_true) # gaussian fit fig, ax = plt.subplots(figsize=(6, 4)) plt.scatter(x, y_true, label='true data') plt.plot(x, y_estimated, label="estimated curve", color="r") ax.set_xlabel('x') ax.set_ylabel('y') ax.set_ylim(0, 1.75) plt.legend() plt.tight_layout() plt.savefig("mix_gauss_fit.png") plt.show() plt.close() # BIC x_bic = np.arange(1,max_num_peak+1, 1) fig, ax = plt.subplots(figsize=(6, 4)) plt.plot(x_bic, bic_arr, color="r") ax.set_xlabel('Number of Gaussian fit') ax.set_ylabel('BIC') plt.xticks(x_bic) plt.tight_layout() plt.savefig("bic.png") plt.show() plt.close() ```[リンク内容](https://omedstu.jimdofree.com/2018/12/01/scipyによる1次元混合ガウス回帰/)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

hayataka2049
hayataka2049

2020/01/25 11:08

入力と出力とは、コードのどの部分に対応しているのですか? 参考サイトのコピペではなく、実際に実行したコードを貼り付け、入力を受け取る箇所および出力箇所をコメントで示すように編集してください。
ygtygtygt
ygtygtygt

2020/01/26 13:43

大変失礼いたしました。ご指摘ありがとうございます。修正させていただきました。
hayataka2049
hayataka2049

2020/01/28 03:39

そのままコピペして動くコードにしていただけませんか? データは直接コード内に埋め込んでください。また、実行してエラーにならないようにしておいてください(num_sampleが未定義だったりとか)。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。