あるケミストの独り言(winchemwinの日記)

ケミスト(化学者)の視点で、面白そうな情報(シミュレーション関係など)を発信

Psi4による量子化学計算ー振動計算 その2

 前回の記事で振動計算について紹介させていただきました。振動計算は、通常構造最適化に続いて行うことも多いことから、構造最適化を行った後にそのまま振動計算をするコードを作成してみました。また構造最適化後の振動計算は、負の振動数がないかどうか(最適化構造が遷移状態に類するものではなく、安定構造となっているかどうか)の確認を目的に行いますので、負の振動数が得られているかどうかの判定も行っています。

 振動数の判定ですが、得られた結果をリスト化した後にnumpy array にして判定しています。負の振動数がなかった場合には”No imaginary frequency"として、振動数のリストを表示させています。負の振動数があった場合は負の振動数を個別に表示するようにしています。

 

構造最適化-振動計算-計算結果の判定 その1

 

構造最適化-振動計算-計算結果の判定 その2

 以下はアセトニトリルの計算結果ですが、負の振動数がなかった場合は以下のような結果が表示されます。

 

振動計算の結果(アセトニトリル)

一方、以下は酢酸エチルの場合で負の振動数が確認された場合の結果の表示になります。

振動計算の結果の一部(酢酸エチル)

  今回は構造最適化からの振動計算及びその結果の判定について紹介させていただきました。次回からは各種物性値の計算事例について紹介したいと思います。
 

機械学習による予測モデルの作成(暑さ指数-東京)その2

    前回の記事で、「暑さ指数」と「気象データ」の相関について、リニアモデルでの機械学習モデルの作成について、紹介しました。今回はハイパーパラメーターの設定の検討のため、SVRSupport Vector Regression,サポートベクター回帰)でのモデル作成を検討しました。

コード 1 必要ライブラリーのインポート

 まずは、Pandas, Numpyなど一般的なものに加えて、SVRの実施と、評価、ハイパラメーター検討に必要なライブラリー(今回はランダムサーチ)を読み込みます。

 

コード2 データ読み込み、前処理

  

  続いて前回と同様に、作成したデータ(csv形式)をpandas のデータフレームとして読み込み、学習用の目的変数(y)としてWBGT、説明変数(x)として、Tg, Temp, windm air press, humidity, rainfall, sunshineをデータフレームから抽出しています。

コード 3 説明変数の標準化

 
   続いて、データのスケールを揃えるため、それぞれの説明変数の標準化の処理をおこなっています。

コード 4 ハイパーパラメータの設定

 SVRでは、主として3種類のハイパーパラメータ(カーネル関数、正則化係数C、不感度係数ε)がありますので、それらの変化の範囲を設定します。今回はランダムサーチで15回ハイパーパラメーターのサーチを行うこととして、コードを作成しました。

 

コード5 評価値の算出

 続いて、ランダムサーチ時に作成したモデルの評価のため、それぞれ評価値の算出も行っています。

 

コード6 最適化過程、結果の表示

 

 最終的にランダムサーチの結果はcv_resultsに辞書型で保存されますので、それらをデータフレームとした後、評価の良い順番にソートして結果を必要なデータ(ランキング、パラメーター、予測精度の平均)表示させています。

 以下は実際にランダムサーチを行った結果です。ハイパーパラメータの値によっては評価値がばらついていますが、ランキングの良いモデルは非常に良い精度で予測モデルが作成できていることがわかります。

 

ランダムサーチの結果

 以上、今回はSVRでの機械学習モデルの作成とランダムサーチでのハイパーパラメーターの検討事例について紹介させていただきました。次回はまた異なった手法でのパイパーパラメーターの検討事例について紹介したいと思います。

 

Psi4による量子化学計算ー振動計算 その1

 


 前回までの記事で、構造最適化計算と得られた計算結果の表示について紹介してきました。

得られた最適化構造が安定構造かどうかと確認するために、振動計算が必要となりますので、今回は振動計算について、紹介したいと思います。

  下記がアセトニトリルの振動計算のコードになります。最初の部分は構造最適化と同様の設定で、Psi4をインポートした上で、計算機のスレッド数、メモリを設定しています。また、構造最適化した座標をgeometryとして設定しています。

アセトニトリルの振動計算のコード

 output_file は振動計算の結果を保存するためch3cn-freq.txt(実際は任意ですが)としています。その下のコードが振動計算をするためのコードで、括弧内で、基底関数(hf/3-21g)、計算対象分子(ch3cn)、波動関数の情報などを設定しています。

 計算だけであれば、ここまでのコードでも行えるのですが、計算が終了しても振動数に関する情報は何も表示されません(output_fileを確認すればよいのですが)。そのため、for 文以下で振動数のデータを取り出して、表示させる(20個分)ようにしています。

 以下は計算結果後の表示データになります。

 実際はアセトニトリルの場合は振動数はそれほど多くないのでよけいなデータも表示されていますので、実際の分子に合わせて表示させる振動数を調整すればよいかと思います。

アセトニトリルの振動計算の結果

 以上、今回は振動計算の実施と得られた振動数の表示について紹介しました。次回は構造最適化に続いて振動計算を行い、さらに負の振動数がある場合の判定を行うコードを紹介したいと思います。

 

機械学習による予測モデルの作成(暑さ指数-東京)その1

  前回までの記事で我が家の電気料金と気象情報との関係について、相関モデルの作成の検討を紹介してきました。残念ながらあまり良い相関モデルが作れませんでしたがので、実際に比較的良い相関がとれそうなもので検討してみようということで、環境省が公表している「暑さ指数」と気象庁の「気象データ」との相関について、検討を行ってみました。暑さ指数は熱中症予防を目的に提案された指標で観測される気象情報から算出される指標です。

 

暑さ指数について(環境省 HPから)

  実際に暑さ指数(WBGT)は下記のような測定値から実測値や、気象庁の観測データから実況測定値が算出されています。

暑さ指数(WBGT)について (環境省HPから)

 

暑さ指数の算出の実際(環境省HPから)

 今回は、機械学習モデル作成の練習として、入手可能な公開データから「暑さ指数」と「気象データ」と間での相関モデル作成の検討を行ってみました。

 暑さ指数のデータは環境省から過去のデータが1時間ごとのデータとしてダウンロードできます。WBGTが暑さ指数のデータで、Tgが黒球温度の観測値を示しています。

 

暑さ指数データ(環境省から)

このデータに気象庁から気温、風速、気圧、湿度、降雨量、日照などのデータをダウンロードしたものを加えて、機械学習用データ(heatindex2020_04_plus_weather.csv)としました。(2020年4月、東京都のデータで作成しています:下記)

 

機械学習用データ(暑さ指数データ(環境省) + 気象データ(気象庁))

  上記データに対して、まずはリニアモデルでの予測モデル作成の検討を行いました。

予測モデル作成コード その1

 まずはPythonから必要ライブラリーの読み込みと、sklearn からリニアモデルや評価指標算出用のライブラリーを読み込みます。続いて作成したデータ(csv形式)をpandas のデータフレームとして読み込んでいます。

 続いて学習用の目的変数(y)としてWBGT、説明変数(x)として、Tg, Temp, windm air press, humidity, rainfall, sunshineをデータフレームから抽出しています。

 

予測モデル作成コード その2

 次に、モデル評価数値(R2,MSE,RMSE)及び相関係数(coefficient) 格納用のリストを作成しています。

 for 文以下でモデル作成を5回トライしています。

 続いて、作成したモデルでのそれぞれの評価数値の算出とリストへの格納を行っています。

予測モデル作成コード その3

 最後に、格納したリストの平均値を算出するとともに、それぞれのトライアルでの相関係数のデータフレームを作成し、結果表示を行っています。

予測モデル作成コード その4

 以下は2020年4月の東京でのデータについて予測モデル作成の検討を行った結果です。

 訓練、テストデータいずれにおいても良好な決定係数を示す結果が得られています。暑さ指数のベースとなるデータを考えれば当然の結果といえば当然の結果かと思います。相関係数を確認すると温度と強い正の相関、日照時間と強い負の相関がみられ、こちらもある意味当然の結果といえるかもしれません。

 

予測モデルの作成結果

 以上、機械学習モデル作成の練習として、暑さ指数のリニアモデルでの作成検討について、紹介させていただきました。

 非常に相関性の高いデータですので、この結果だけでも学習モデルとしては十分かと思いますが、自身の勉強の意味で、他の学習モデルやハイパーパラメータ設定の検討なども行っていますので、それらの結果について、順次紹介できればと思います。

機械学習による予測モデル作成(我が家の電気使用量 その2)

 前回までの記事で我が家の電気使用量について、sklearn のlinear modelでの予測モデルの作成について紹介しました。必ずしも目的変数と説明変数の設定が良いものではないので、linear modelでは良い結果は得られませんでした。

 それでは他のmodelではどうかということで、下記の記事を参考にsklearn で検討可能な回帰モデルを片っ端から検討してみました。

qiita.com

 

 まずは、記事を参考にライブラリーのインポートを行います。

実行したコード その1(ライブラリーのインポート)

 続いて、インポートしたモデルの条件設定です。実際はそれぞれのモデルで様々なハイパーパラメーターの設定ができるかと思いますが、今回は網羅的に行うため、上記記事を参考にごく一般的なものとしています。

 

実行したコード その2(モデルの条件設定)

 続いて、モデル検討条件の設定と学習用データの読み込みです。学習データの読み込みと前処理は前回までの検討と同様です。

実行したコード その3 (データの読み込み)

実行したコード その4 (データの前処理等)

 データの読み込み、前処理が終了したら、実行準備としてデータ格納用のリストを作成しておきます。

実行したコード その5 (格納用リストの作成)

 いよいよ実施モデル作成ですが、複数のトライアルを行うので、その部分をfor 文で作成しておきます。続いて、それぞれのモデルについて予め辞書型で設定しておいた条件を読み込み、モデル作成を行います(reg.fit)。得られたモデルの評価としてR2、MSE, RMSEを算出し、それぞれのリストに追加しています。

実行したコード その6(予測モデルの作成と関連数値の算出)

 続いて、算出したそれぞれのトライアルの数値の平均値を算出した上で、作成モデルの代表値としてリストに格納し、それぞれの結果を表示しています。

 

実行したコード その7 (関連数値の処理、表示)


 上記は休日データでのモデル作成でしたが、以下のコードで平日データも同様に処理しています。

実行したコード その8 (平日データの処理 その1)

実行したコード その9(平日データの処理 その2)

 以下が上記コードを実施した結果になります(休日)が、訓練データではR2値でそれなりの数値がでているものもありますが、テストデータでは使えそうなモデルと思えるデータは残念ながらありませんね(笑)。目的変数と説明変数の設定があまりよろしくないというところかと思います。

 

 以上、sklearn でのモデル作成の検討でした。
 












 

 

Psi4による量子化学計算ー構造最適化(化学構造の描画)

 前回までの記事で水分子の構造最適化と座標データの表示について紹介させていただきました。今回は最適化構造の可視化について、紹介したいと思います。可視化にあたっては、jupyter notebook 上で可視化できるpy3Dmolを使用しています。py3Dmolについては「化学新しいカタチ」さんのブログで詳細に紹介されています(私も参考にさせて頂きました)ので、参考にして貰えればと思います。

future-chem.com

 

 以下はアセトニトリルの構造最適化とpy3Dmolを利用した可視化のコードになります。座標データについては、前回の記事で記載したようにxyz形式のファイルで保存しています。

 py3DMolですが、conda もしくはpipコマンドで予めインストールしておく必要があります。以下のコードではpy3Dmol のライブラリーをインポートし、さらに表示用のウィジェット(ipywidgets)もインポートしています。

アセトニトリルの構造最適化ー構造の描画

 いろんな化合物を表示するコードを前提にdef で関数設定していますが

、1分子だけの表示であればdef , return の部分は省いてもらってもいいいかと思います。表示は読み込みの座標(xyz), 表示範囲、表示スタイルなどを設定した上でview.show( )で行っています。

 以下は実際の描画結果になります。

最適化後のアセトニトリルの構造

 炭素原子が灰色、窒素原子が青色、水素原子が白色で表現されています。視覚化されることで最適化構造が非常ににわかりやすくイメージできるかと思います。計算で本当に妥当な立体構造に最適化されているかのチェックにも非常に有効です。

 Psi4はpythonコード上で利用可能ですので、上記のようにpsi4だけの機能では難しいことも、python で利用できる他のライブラリーをうまく組み合わせることでいろいろできるようになります。この辺が実験化学者にとってPsi4の大きなメリットの一つと

言えるのではないでしょうか。

 次回は構造最適化後に実施する振動計算について紹介したいと思います。

機械学習による予測モデル作成(我が家の電気使用量 その1-2)

 

 この前の記事で我が家の電気使用量と気象データとの相関について、データの前処理について紹介しました。今回は実際の解析と解析結果の表示について紹介したいと思います。

 

sklearn による解析準備


 まず、機械学習を行うにあたり、目的変数と説明変数を設定しています。先の記事にも記載したようにウィークデイと週末では電気使用量に大きな差がありますので、それぞれのケースで機械学習のモデル作成を検討しています。

 続いてsklearn からモデルのインポートを行っています。今回はシンプルな'linear model'を選択しています。その後、データを学習用の訓練データとテストデータに分割して(train_test_split)準備は完了です。

  以下は休日データを使った学習とその結果の表示になります。

機械学習の実施 1

学習ですがlinear model で回帰モードで学習を行っています(fit)。また学習結果の確認ですが、回帰分析の精度評価指標となる決定係数(R2)と関係係数で確認を行い、プリントアウトしています。

 

 

 

学習結果の表示

 学習結果ですが、見ていただいたらわかるように(上段が訓練データの決定係数、下段が学習データの決定係数)、決定係数としては非常に悪い値となっています。また説明変数の寄与を示す関係係数も算出していますが、あまり良いモデルではないので、意味はないですね。

 次回以降、より良いモデルの作成の検討について、いくつか実施した内容について紹介してゆきたいと思います。