The temperature correction inflates the signal-to-noise ratio of the LEDs: the noise is not divided by the reduction factor

オープン 初心者向け
#175 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
78/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
python
領域
data

調査の方向性

まず ExtinctionCoefficients.apply_temperature_correction から始め、参照強度とノイズ列をどのように更新するかを追ってください。次に calc_and_set_coefficients と calc_and_set_coefficients_mp を確認し、SNR の算出方法を調べてください。温度補正ありとなしで同じ抽出データを使うテストを追加し、calc_coefficients_of_img に渡される SNR が変わらないことを確認してください。

索引モデルが issue の本文から書いたものです。

説明

ExtinctionCoefficients.apply_temperature_correction divides the reference property by the reduction factor of every value, but leaves its noise column as it was extracted:

corrected_intensities = self.calculated_img_data[self.reference_property] / factors
self.calculated_img_data = self.calculated_img_data.assign(
    **{self.reference_property: corrected_intensities})

The signal-to-noise ratio that weights the LEDs in the linear solver is then formed from the corrected intensity and the uncorrected noise (calc_and_set_coefficients and calc_and_set_coefficients_mp):

snr = single_img_array / single_img_data[self.noise_property].to_numpy()

So with a temperature correction every SNR comes out too high by 1/factor. The correction rescales the signal, it does not add any: the SNR of a measured value is I/σ before and after it. The weight min(1, SNR / snr_full_weight) is meant to be the inverse standard deviation of the optical depth -ln(I_e/I_0), and the correction does not change that either.

Effect

Only LEDs below snr_full_weight are affected, because the weight is capped at 1. With a reduction factor of 0.8 and the default snr_full_weight = 10:

true SNR weight now correct weight
8 1.0 0.8
4 0.5 0.4
1 0.125 0.1

The min_layer_weight cut-off is computed from the same weights, so layers are set to NaN later than they should be. The error grows with the reduction, i.e. with the LED temperature, which is highest where the smoke is densest and the LEDs approach the noise floor, so it hits exactly the LEDs the weighting exists for.

Runs without a temperature correction, and runs of a reference property without a noise column, are not affected.

Fix

Divide noise_sum_col_val by the same factors in apply_temperature_correction whenever self.noise_property is loaded. The moving average runs before the correction for both columns, so they stay consistent.

A test: for the same extracted data, the SNR passed to calc_coefficients_of_img should be the same with and without a temperature correction.

主要言語
Python
スター
7
フォーク
4
平均マージ
3時間 58分
マージ済み PR(30日)
35

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

FireDynamics/LEDSmokeAnalysis のほかの issue

FireDynamics/LEDSmokeAnalysis の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。