旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【WPF】 UIElement上のマウスイベントが発生しない

Imageの上にCanvasを置いて、CanvasにLineやEllipseをマウス操作を通じて描くことで、仮想的にImage上に絵を描いたように見えるようにしたいと思っています。

<Image .../>
<Canvas .../>

そこでCanvasにMouseDownイベントを付けたのですが、Canvasをクリックしても一向にMouseDownイベントが発生しませんでした。このような時の対処法がここに書かれていました。

自分の場合はリンク先に書かれている1番のやり方(CanvasのBackgroundにTransparentを指定すること)でMouseDownイベントが発生するようになりました。

【Python】 季節性分解実行時のエラーへの対処

季節性分解のやり方を調べていると、seasonal_decomposeメソッドを利用すれば良いことが分かりました。ただ、実行すると

TypeError: ‘numpy.float64’ object cannot be interpreted as an integer

というエラーが出てしまいました。

import statsmodels.api as sm

df = pd.read_csv('time_series_data.csv', index_col=0)
df = df.reset_index()
df['datetime'] = pd.to_datetime(df['datetime'], format='%Y/%m/%d')
df['y'] = df['y'].values.astype(float)
df = df.set_index(['datetime'])
# ここでエラー
res = sm.tsa.seasonal_decompose(df.values, freq=7)
res.plot()
plt.show()

このエラーはstatsmodels\tsa\filters\filtertools.pyの下記コードを

elif nsides == 2:
    trim_head = np.ceil(len(filt)/2.) - 1 or None
    trim_tail = (np.ceil(len(filt)2.) - len(filt) % 2) or None

下記のように書き換えると動作するようになりました。

elif nsides == 2:
    trim_head = np.ceil(len(filt)/2.) - 1 or None
    trim_head = (int)(trim_head)
    trim_tail = (np.ceil(len(filt)2.) - len(filt) % 2) or None
    trim_tail = (int)(trim_tail)

【Python】 ピリオドグラムを描画する

グラフの周期を調べるためピリオドグラムの描画方法を調べていたのですが、statsmodels.tsa.stattoolsのperiodogramを使えば良いようです。

from statsmodels.tsa.stattools import periodogram

data = np.array([0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 1.0, 0.0])
pg = periodogram(data)
plt.plot(pg)
plt.show()

【WPF】 画像ファイルをBitmapImageに読み込むと、その画像ファイルを削除できなくなるケースの対処法

Imageクラスに画像を表示するため下記のようなコードを書くと、画像ファイルを消去するときに例外が出てしまいました。

// 画像を読み込む
var bmp = new BitmapImage(new Uri(filePath));
// Imageに表示する
SomeImage.Source = bmp;

// もう画像を表示する必要は無い
SomeImage.Source = null;
// 画像ファイルも不要。でもファイルがロックされっぱなしで消せない
File.Delete(filePath);

上記問題に対する対処法が以下に書かれていました。感謝です。

ファイルから解放可能なBitmapImageを読み込む。 - Neareal

【Python】 フレームワークによるBatchNormalizationのmomentumの違いについて

KerasのBatchNormalizationの引数momentumはデフォルト値が0.99です。一方でTorchのBatchNormalizationの引数momentumはデフォルト値が0.1のようです。
いくらフレームワークが違うといっても、ここまで初期値が違うものかと調べてみると、Kerasは下記式のαをmomentumと呼んでいて(Tensorflowのassign_moving_averageメソッドまで辿るとmomentumではなくdecayという名前に変わっています)、Torchは1-αをmomentumと呼んでいるようです(Batch Normalization Momentum? · Issue #695 · torch/nn · GitHub)。

 MovingAverage(t)=MovingAverage(t-1)×α+BatchAverage(t)×{(1-α)}

TorchのプログラムをKerasに移植する、またはその逆を行う場合には注意が必要そうです。

【Python】 AUC計算方法のメモ

PythonでAUCを計算する方法を探していたのですが、下記がコードも掲載されており詳しかったです。

qiita.com

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_curve, auc

classifier = RandomForestClassifier()
predictions = classifier.predict_proba(X)
precision, recall, thresholds = roc_curve(Y, predictions[:,1])
score = auc(precision, recall)