DCEKit への新機能追加です。
こちらの Iterative Optimization Technology (IOT) を実装しました。
IOT では、純成分のスペクトルと混合物のスペクトルのみから、混合物における各純成分の濃度 (モル分率) を推定できます。たとえば Partial Least Squares (PLS) などで回帰分析を行うときは、混合物において各純成分の濃度が既知のデータセットが必要ですが、IOT ではそれが必要ありません。トレーニングデータなしでも各純成分のスペクトルさえあれば、濃度不明の混合物のスペクトルのみから、純成分のモル分率を重みとした純成分のスペクトルの線形結合で混合物のスペクトルが与えられると仮定して、そのモル分率を推定できます。
具体的には DCEKit におけるデモンストレーション demo_iot.py をご覧いただき実行していただければと思います。demo_iot.py を実行しますと、まず仮想的なスペクトルを (デモですので適当に) 生成します。
これらの 6 つのスペクトルを、純成分のスペクトルと考えます。次に、6 つの純成分を適当なモル分率 (乱数) で混合したと仮定して、混合物のスペクトルを作成します。
今、本当のモル分率は隠しておいて、純成分のスペクトルと混合物のスペクトルのみから、IOT により混合物における純成分のモル分率を推定します。推定すると、こちらのような結果になりました。
Predicted mole fractions : [0.18137258 0.02174459 0.35588431 0.11387885 0.25991933 0.06720033]
True mole fractions : [0.18136134 0.02176802 0.35588604 0.11387007 0.25991822 0.0671963 ]
本当のモル分率は乱数で生成しているため、実行するごとに結果は異なると思いますが、どのような場合であれ、推定されたモル分率と本当のモル分率がとてもよく合っています。このように IOT では、純成分のスペクトルと混合物のスペクトルのみから、混合物における各純成分のモル分率を推定できます。
ちなみに、残差のスペクトルは以下のようになっており、
10 の −6 乗のスケールであり、0 に近いことがわかります。これが 0 に近くないとき、成分間の相互作用などが原因で、実際のモル分率をうまく推定できていない可能性があります。
デモンストレーションの Python コードにおける
# IOT prediction
pred_mol_fracs = iot(mixture_spectra, pure_spectra)
において、mixture_spectra (混合物のスペクトル) と pure_spectra (純成分のスペクトル) から IOT により pred_mol_fracs (混合物における各純成分のモル分率) を推定しています。デモでは pure_spectra と mixture_spectra を仮想的に生成しましたが、これらをたとえば csv ファイルなどから読み込むことで、ご自身のデータセットにおいても IOT による推定が可能になります、
ぜひご活用いただければと思います。
以上です。
質問やコメントなどありましたら、twitter, facebook, メールなどでご連絡いただけるとうれしいです。