---
# System prepended metadata

title: "分類もう一回 \U0001F644"

---

# 分類もう一回 🙄

## 周波数領域(平均)
|次元圧縮|分類|Accuracy|Precision|Recall|F1|
|:----:|:----:|---|---|----|----|
|なし| LGBM |0.66|0.69|0.94|0.79|
|SVD | LGBM|0.70|0.75|0.90|0.81|
|NMF | LGBM |0.62|0.71|0.81|0.74|
|なし| SVM |0.72|0.75|0.92|0.82|
|SVD | SVM |0.77|0.77|1.0|0.86|
|NMF | SVM |0.67|0.78|0.8|0.78|
|なし| RandomForest |0.73|0.75|0.96|0.84|
|SVD | RandomForest|0.73|0.73|1.0|0.84|
|NMF | RandomForest |0.71|0.72|0.97|0.83|

## 周波数領域(連結)
|次元圧縮|分類|Accuracy|Precision|Recall|F1|
|:----:|:----:|---|---|----|----|
|なし| LGBM |0.69|0.71|0.92| 0.80|
|SVD | LGBM|0.68|0.71|0.92|0.80|
|NMF | LGBM |0.63|0.71|0.79|0.74|
|なし| SVM |0.74|0.80|0.86|0.82|
|SVD | SVM|0.72|0.72|1.0|0.83|
|NMF | SVM |0.76|0.77|0.99|0.86|
|なし| RandomForest |0.74|0.75|0.99|0.85|
|SVD | RandomForest|0.75|0.75|0.99|0.85|
|NMF | RandomForest |0.7|0.74|0.93|0.82|


# ミーティングメモ
重要特徴量はいくつかあるから赤線は何本も引けるの？
対数をとって大きい値をなくす
重要特徴量を4つ持ってきて可視化する
- バラバラでもいいけど同時に表示することがベスト


## やること
- 重要特徴量の4つの分布をそれぞれ出力する
- SHAP値をそれぞれのデータで違う値が取得できるか検討する

1d CNNだとデータごとに違う線が引ける？
もっと正確に工程を特定する
# 2024-09-01
## 卒論の追加実験を検討してみる
### やること
- 周波数領域のモデルから取得した重要特徴量を分布で表示してみる
- スペクトログラムに縦軸を可視化してみる
    - LIME編
        - 特定のサンプルに対して、時間領域のデータをわずかに変更し、その結果としてのモデルの出力変動を観察して、時間軸上の各部分がモデルにどの程度影響を与えているかを定量化する。
    - SHAP値編
        - 全体のモデル予測に対する各時間点の貢献度を計算する
### スペクトログラムの縦軸を検討する
時間領域
理由は時間領域のデータは圧縮していないデータを使わなければ時間を考慮したことにならないから。

### 重要特徴量を分布で表示する
あと少し
![image](https://hackmd.io/_uploads/Bkh_hbVh0.png)



# 2024-08-18
- なぜ1つではなく、３つの特徴量をプロットしたのか？
- 急に減るとこがあるが、今回は検証できなかった。
- 縦に結合するFFTは10720に修正する
- imgをなくす
    - realナンバーを足せばいだけ？
    - ノルムを計算する？xreal
    - yreal * yimgを二次元ベクトルだと思って計算する
        - ノルムを計算することができる
        - 三つのスカラー値が出てくる
    - zreal * z

## 周波数領域リベンジ
以前の方法
- 元データをFFT→平均する
- 元データをFFT→連結する
新しい方法
- 元データを平均する→FFT
- 元データを連結する→FFT
## 周波数領域(平均)
|次元圧縮|分類|MSE|MAE|
|:----:|:----:|---|---|
|なし| LGBM |329.92|13.73|
|SVD | LGBM|253.90|14.22|
|NMF | LGBM |547.60|19.37|
|なし| SVM |205.75|9.29|
|SVD | SVM|205.65|9.29|
|NMF | SVM |202.29|9.16|
|なし| RandomForest |213.87|11.82|
|SVD | RandomForest|215.11|11.99|
|NMF | RandomForest |229.07|11.26|

## 周波数領域(縦に結合)
|次元圧縮|分類|MSE|MAE|
|:----:|:----:|---|---|
|なし| LGBM |309.77|14.55|
|SVD | LGBM|234.42|11.96|
|NMF | LGBM |334.14|14.94|
|なし| SVM |205.50|9.24|
|SVD | SVM|205.45|9.24|
|NMF | SVM |206.47|9.26|
|なし| RandomForest |281.30|13.76|
|SVD | RandomForest|219.88|12.49|
|NMF | RandomForest |244.81|11.93|
# 2024-08-16 発表資料作成
- 工程ごとに分けなかった理由は？
    - 除去率は全行程でのもので、各工程のものではないので不適切
    - 各工程の場合、そのデータをいただくか全行程と比較する
- 他のサンプルでフィードバックできるか確認する
- なぜインデックス番号が周波数なのか？
    - 最大値はベクトルに入っている値
    - 分解した行列5360個が並んでいる
    - オリジナルの周波数が並んでいます。
    - 該当する番号の最大値
- 手荷物の限度
    - 
- 

# 2024-08-05 研究残りタスク

## 研究の着地点
- RNNの実験について
    - 過学習をした可能性があり、次元圧縮はほぼ必要
    - パラメータ数が非常に多いので↑
- どの工程にどの周波数があるかわからない
    - ここでスペクトログラムが出てくるところ
    - どの時間にどの周波数があるか知ることができる
    - 次元圧縮をしてしまっているため周波数領域でのフィードバックできるのか？
    - 行列を元に戻すことが大事
    - 行列分解の逆をして時間と周波数の違いを調べた上で、その部分をスペクトログラムで確認する
    - 重要特徴量を求めた上で元に戻して、その時間特徴量と周波数特徴量をスペクトログラム上で確認する
    - 横時間、縦周波数情報どちらも使えば
    - 横軸はデータによって異なるから難しい？
    - 横方向に線が引ける形になる？
- 時間領域でXAI
    - Shapでやってみる
    - 時間によってのフィードバックできない理由を示す(補足ではない)
        - いつの情報が重要かわかったところで全てのデータでそれが行われているとは限らない
- 左右の手で分けていいの？
    - もっというと左手の動きが右手の除去率に影響している可能性がある。その逆も然り。
    - 今後の課題
        - とりあえずは別々のサンプルで行った
        - 6軸のデータで入力して1サンプルで除去率で回帰する必要もある
- ハイパス、ローパス
    - 一番いいのはちゃんとやってフィルターは関係なかったからフィルターをかけないものを書いたということ
        - 今は難しそう
    - 
- 言ったはいいもののどの工程にどの周波数領域があるかわからない
    - まずは良否のデータのどっちにどれくらいの周波数が含まれているか確認する必要がある？
- 重要特徴量の指標が行列分解で違うため、考察することができない


## 考察の考察
周波数領域の結果で平均だとSVDしてRandom　Forestが一番いい成果が出た。連結だとそのままRandom Forestがいい結果が出た。平均は情報量として冗長なデータが削除することができた。->短いけども冗長なデータがあった。
周波数領域(連結)で最も良好な結果は
なんでSVDとNMFは比較しなくていいの？
# 回帰の精度を算出する

## 周波数領域(平均)
|次元圧縮|分類|MSE|MAE|
|:----:|:----:|---|---|
|なし| LGBM |343.21|15.30|
|SVD | LGBM|410.74|14.98|
|NMF | LGBM |309.18|12.58|
|なし| SVM |306.31|13.17|
|SVD | SVM|306.31|12.99|
|NMF | SVM |377.26|14.31|
|なし| RandomForest |278.29|13.58|
|SVD | RandomForest|**221.29**|**10.75**|
|NMF | RandomForest |296.72|15.76|

## 周波数領域(縦に結合)
|次元圧縮|分類|MSE|MAE|
|:----:|:----:|---|---|
|なし| LGBM |320.67|13.96|
|SVD | LGBM|349.64|15.63|
|NMF | LGBM |383.45|15.27|
|なし| SVM |225.57|11.45|
|SVD | SVM|225.57|11.45|
|NMF | SVM |221.09|12.12|
|なし| RandomForest |274.58|13.37|
|SVD | RandomForest|314.61|14.16|
|NMF | RandomForest |**218.85**|**11.20**|

## 時間領域(平均)

|次元圧縮|分類|MSE|MAE|
|:----:|:----:|---|---|
|なし| 1D CNN |368.86|16.77|
|SVD | 1D CNN|453.54|18.12|
|NMF | 1D CNN|326.65|16.10|
|なし| RNN |5920.15|75.75|
|SVD | RNN|293.25|14.80|
|NMF | RNN |**218.85**|**11.20**|

## 時間領域(縦に結合)
|次元圧縮|分類|MSE|MAE|
|:----:|:----:|---|---|
|なし| 1D CNN |360.76|17.97|
|SVD | 1D CNN|193.89|**11.11**|
|NMF | 1D CNN |289.44|14.79|
|なし|RNN|6498.00|79.40|
|SVD |RNN|**181.78**|11.16|
|NMF |RNN|482.28|20.65|

# ユーザーへのフィードバック方法を考える
## やること
- 正しく判別できているか
- 特徴量の重要度を可視化する
## ミーティング
- どこの指標を見ればいいか
    - y_predとy_testを見比べる
    - 正例の方が多いのに結果が違う
    - 良否を正確に判別できているか確認する
        - Specificity
        - Precision
        - Recall
        - FN Rate
- 比較表をフィードバックにどう活かすか(後で大丈夫そう)

    - 一番精度が良かったもの
- どの周波数領域が多いのかわかる方法は？
    - 重みを可視化する
    - 　どの説明変数の重みが大きいか
    - 　縦軸に重み、横軸に時間軸か周波数軸か

## どうやってユーザーにフィードバックする？
これはリアルタイムでフィードバックするというよりも、データを見てよく洗えているか否かを確認したいということ。
なぜよく洗えていないのか、よく洗えているデータと何が違うのか説明できるようにしたい。

### スペクトログラム
良く洗えているデータの平均と比較することで良否を判定することができる？



## そもそもなぜ比較表を作ったのか？
- 手洗いデータの良否が分けれることを知りたい
- 加速度センサー情報から取得することができる有益な特徴量を知りたい
- 加速度センサー情報を扱うのに有益なモデルはどれか知りたい


## 時間軸領域と周波数領域の比較
### 時間領域が優位な場合
- 時間領域のデータは、手洗いの動作や間隔を反映しているため、手洗いの良し悪しを識別する上で重要な特徴を捉えている可能性がある
- 手洗いの動作の変化やリズムのパターンが、良い手洗いと悪い手洗いの違いを示すため、時間領域の情報が有効である
### 周波数領域が優位な場合
- 周波数領域のデータは、特定の周波数成分が手洗いの品質に関連していることを示している可能性がある
- 特定の動作や振動パターンが手洗いの良し悪しを示している
## 縦に結合と平均の比較
### 縦に結合が優位な場合
- 各軸（x, y, z）の情報を個別に保持することで、手洗い動作のパターンを捉えることができている
- 各軸の動きが独立して有意な特徴を持っている(相関がない?)
### 平均が優位な場合
- 手洗い動作が全体としての振動や動きのパターンを示す場合、平均を取ることでノイズを減少させ、主要な特徴を抽出しやすくなる(相関がある？)

## 次元圧縮の比較(なし、あり)微妙・・・
### 次元圧縮なしが優位な場合
- 元のデータの情報を全て保持することで、手洗い動作の微細な変化やパターンを捉えることができている
- 圧縮によって失われる情報が重要である
### SVDが優位な場合
- データの主成分を抽出することで、手洗いの主要な動作パターンを効率的に表現できている
- データの分散を最大限に保持することで、重要な特徴を維持しつつ次元を削減できている(分散？)
### NMFが優位な場合
- 非負値変換によって、人間が解釈しやすい形での次元圧縮が行われるため、特徴の意味を理解しやすい
- 物理的な意味を持っている可能性がある

## モデルの比較

# 2024-07-13 時間領域の比較表を作る
時間領域にはLight GBMを使った方がいい？
周波数領域のコンポーネント数はSVD, DNFどちらも200でいい？

どう結論に持っていく？
フィードバックをどうするの？
- スペクトログラム
    - 周波数と時間軸がまたがっている
### 時間領域(縦に結合)

|次元圧縮|分類|Accuracy|Precision|Recall|F1|Specifycity| FN Rate|
|:----:|:----:|---|----|----|----|---|---|
|なし| 1DCNN |0.70|0.76| 0.86|0.81|0.20|0.13|
|SVD | 1DCNN|0.75|0.77|0.93|0.84|0.20|0.06|
|NMF | 1DCNN | -|-|-|----|
|なし| RNN |0.75|0.75|1|0.85|0.00|0.00|
|SVD | RNN | 0.65|0.75|0.80|0.77|0.2|0.2|
|NMF | RNN |||||

### 時間領域(平均)
SVDコンポーネント数： 100
NMFコンポーネント数: 

|次元圧縮|分類|Accuracy|Precision|Recall|F1|Specifycity| FN Rate|
|:----:|:----:|---|----|----|----|---|---|
|なし| 1DCNN |0.65|0.72| 0.86|0.78|0.00|0.13|
|SVD | 1DCNN| 0.55|0.68|0.73|0.70|0.00|0.26|
|NMF | 1DCNN |0.70|0.73|0.93|0.82|0.0|0.06|
|なし| RNN |0.75|0.75|1|0.85|0.00|0.00|
|SVD | RNN |0.6|0.70|0.8|0.75|0.00|0.2|
|NMF | RNN |0.75|0.75|1|0.85|0.00|0.00|
# 2024-07-13 ランダムで学習させて平均とってみる
## 考慮するポイント
- 過学習なのか
- 訓練データとテストデータの割合
- 第２種の過誤と特異率に注目
- 10回訓練と予測を繰り返す
## 表を持って何を主張するか
- フィードバックの可能性
    - だからどうフィードバックするか
    - スペクトログラム？
        - スペクトログラムはどのタイミングで出てくる？
- 縦結合と平均で起こる違いは？
- 分類木ごとの違いをまとめる
- テストと訓練の比率を合わせる
    - Random Stateを変えても比率は変わらないのか？
- よく洗えていないデータを良く洗われていると判定することは避けたい
    - 第２種の過誤

特異率を大きくして、第二の過誤を小さくしたい


縦結合より平均が良くなった場合
縦の方が情報の圧縮が大きい
縦の方は次元数が(入力特徴量が多い)過学習がしやすい
- 過学習をしているか確認する
    - 訓練データの予測結果とテストデータの予測結果を比較する
- 回帰はどうするのか

## Random Stateを変えて平均することで予測値を求める
### 時間領域
|手法|Accuracy|Precision|Recall|F1|Specifycity|FN Rate| 
|----|----|---|----|----|---|---|
|1D CNN|0.70|0.76|0.86|0.81|0.2|0.13|
|RNN|0.75|0.77|0.93|0.84|0.2|0.06|


# 2024-07-12 ミーティング
## やってきたタスク
- 最長のデータを最短のデータに合わせても問題ないか確認する
    - 1D CNN, RNNにかける
- 全て同じ長さに合わせてSVD, NMF
- 100件のデータにLight GBM

## どうやって論文で伝えるか
時間成分と周波数成分で比較してなぜうまくいったかを説明できるようにする。
周波数成分がよかった場合の理由を示す
8:2で訓練データとテストデータを分けてデータの中身を何回か分けて平均を出す。
最終的にはなぜ違いがあるかを説明したい
FFT, SVD, NMFだけ(混ぜるな危険)

データの結合の仕方
- 平均する
- 縦に繋ぐ
SVD, NMFは縦方向に圧縮する



## 次やるタスク
- FFTの結果を縦に繋ぐ、平均するを別々に行う
- FFTの結合してからSVD, NMFを行う
    - 100コンポーネントだと0.72
    - 行列分解したものを入れる位置に注意する
- DMDは3軸に行えるかも
- 結合の仕方注意して
    - SVM, RFで分類を行う
- Precision, Recall, F1を出してくる
- スペクトログラムもみてみる
- 結果を出すときはデータを混ぜて行うようにして複数回の平均を出す

分類と回帰(除去量)で低くするのもあり。
次元圧縮
- SVD
- NMF
- DMD
分類
- SVM
- RF
回帰
- precision recall

## 比較表
[プログラムリンク](https://colab.research.google.com/drive/1e6lHzzp9VTsGEPzVoebhKeZe6fdx-aPh#scrollTo=UCk-lAPeTNpB)
### 時間領域
|手法|Accuracy|Precision|Recall|F1|
|----|----|---|----|----|
|1D CNN|0.65|0.72|0.86|0.78|
|RNN|0.70|0.76|0.86|0.81|
### 周波数領域(縦に結合)

|次元圧縮|分類|Accuracy|Precision|Recall|F1|
|:----:|:----:|---|----|----|----|
|なし| LGBM |0.72|0.81|0.86|0.83|
|SVD | LGBM | 0.70|0.76|0.86|0.81|
|NMF | LGBM | -|-|-|----|
|なし| SVM |0.66|0.90|0.66 |0.76|
|SVD | SVM | 0.70|0.76|0.86|0.81|
|NMF | SVM | -|-|-|----|
|なし| RF |0.83|0.83|1|0.90|
|SVD | RF | -|-|-|----|
|NMF | RF | -|-|-|----|
### 周波数領域(平均)
[プログラムリンク](https://colab.research.google.com/drive/1s43J2sUnjq0GL7bEYIXZs5BUXCxDhfBv)
|次元圧縮|分類|Accuracy|Precision|Recall|F1|
|:----:|:----:|---|----|----|----|
|なし| LGBM |0.7|0.73|0.93|0.82|
|SVD | LGBM |0.75|0.75|1|0.85|
|NMF | LGBM |0.75|0.75|1|0.85|
|なし| SVM |0.75|0.75|1|0.85|
|SVD | SVM |||||
|NMF | SVM |0.75|0.75|1|0.85|
|なし| RF |0.75|0.75|1|0.85|
|SVD | RF | ||||
|NMF | RF |0.75|0.75|1|0.85|


### データの長さが違う問題について
最後の工程が切れてしまうが、その工程がそこまで大事なわけではない。
圧縮した方が逆に周波数が変わってしまうため、学習に問題が起こってしまう。

訓練データのロスとテストデータでのロス違いがあれば過学習である。
テストデータと訓練データを変えて何回か行ってみる。


# 2024-07-05 ミーティング
関連研究では手法、技術の
似たような研究を列挙して、共通点と相違点を明らかにする。
多ければ多いほどいいけど5件くらい
技術の論文ではなく、その技術を使って論文を関連研究として使う

ローパス・ハイパスと比較して必要ないからノーパスでやる


## やったこと
- データの前処理
    - (fftの結果の長さが違うとクラスタリングの結果にも違いが出る？)
    - fft, svd, nmf
    - 周波数領域のクラスタリング
    - LightGBMかける
- 原稿に付け足してみる
## 来週までにやろうと思っていること
- データの前処理のやり直し
    - 行数が一致していないからfftをやり直す
    - svdもnmfもやり直す
- 原稿をTEXで書いてみる
    - 話しの構成を考える
- 中間発表の準備
    - 話しの構成を考える(原稿を元に作成する)
    - 可視化したものを貼り付ける
        - ->全て時間成分と周波数成分に対して行う
        - 可視化
        - クラスタリング
        - 相関図
- LightGBMの他にも(1D CNN, RNN->これは時間成分)もコード書いてみる
    - どのバリエーションで学習させるか
    - なぜこれらを使うのかも考える
    - 1D CNN, LightGBMは周波数成分に行う
    - RNNは時系列データに対して行う
- 関連研究を調べてなぜ使われているかを補足する
    - 自分がするならどんな研究をするか？
    - まだやられていないことをメモする

## 実際のタスク
# 2024-07-04 FFTとSVD,NMFと手洗いデータの関連性をまとめる
実験設定、比較手法で書くのかな？
非負値行列分解わかりやすかった。
https://thinkit.co.jp/article/17411
## タスク
- fftに改良が必要
    - 左右の手で測定時間が違うため、合わせる必要がある。
    - それに伴いsvd, nmfも再度実行する必要がある。
- nmfの特徴量が増えることで意味はあるのか、比較する必要がある。
## FFT(Fast Fourier Transform)とは
> FFT（英：Fast Fourier Transform）とは、離散フーリエ変換（DFT、英: Discrete Fourier Transform）を高速に計算する手法を指し、「高速フーリエ変換」とも呼ばれます。
元になっているのは、周期性をもつ波であればどのような形であったとしても正弦波と余弦波の級数で表すことができる、という理論で、これを数式にした「フーリエ級数」を拡張・発展させたものをフーリエ変換と呼びます。中でも、離散化されたフーリエ変換は「離散フーリエ変換」と呼ばれ、コンピュータで行われるフーリエ変換は基本的に離散フーリエ変換を指します。従来のフーリエ変換は莫大な回数の計算を要していましたが、順序などを工夫することにより計算量を大幅に減少させたものがFFTです。
### なぜこの実験で使われたか
どうやって時間成分と周波数成分の有用性の違いを出すか？説明のために時間軸も実験の要素として入れる必要がありそう。

手洗いデータの解析において、時間成分と周波数成分を比較することで、データの特性を理解することができる。実際の実験では、8つの工程に合わせて手洗いが実施されており、時間成分ではこれらの工程の波形が観察される。

### 時間成分と周波数成分の比較
- 時間成分: 手洗いデータをそのまま時間軸上で観察した場合、手洗いの各工程に対応する動作が時間経過に沿って記録される。これは「ある時点」の瞬間を切り取ったものであり、各工程の動きを確認することができる。しかし、時間成分という特徴量は、異なる手洗いの間での直接的な比較には適していない。なぜなら、手洗いの8つの工程がどの時点で行われるかは手洗いごとに異なる可能性があるからである。例えば、1分時点で必ずしも同じ動作が行われているとは限らないため、時間成分のみでは定量的な比較が難しい。

- 周波数成分: 手洗いデータをFFTを用いて周波数成分に変換することで、時間成分のデータを周波数スペクトルとして表現できる。周波数成分では、データ全体の周期的なパターンが抽出され、各工程の振動数や強度を定量的に把握することができる。これは、手洗いの動作が持つ固有の振動特性を反映するため、異なる手洗いでも比較が可能である。

### 周波数成分に変換することで定量的に測れる理由
周波数成分に変換することでデータを定量的に測れる理由は以下の通りである。：

- 周期的な特徴の抽出: 周波数成分では、手洗い動作の周期的な特徴が抽出される。これにより、動作が持つ固有の振動数を特定し、手洗いの良し悪しを評価するための定量的な指標を得ることができる。

- ノイズの除去: 周波数成分に変換することで、低周波数成分（ゆっくりとした動き）や高周波数成分（速い動き）を分離でき、ノイズや不要な成分を除去しやすくなる。これにより、データの解析精度が向上する。

- 比較の容易さ: 周波数スペクトルとして表現されたデータは、異なる手洗いデータの間で直接比較することができる。特定の周波数成分が強調されているかどうかを確認することで、手洗いの良し悪しを定量的に評価できる。

## 行列分解
### SVDとは
#### なぜこの実験で使われたか
#### SVDを用いる理由と意義


### NMFとは
#### なぜこの実験で使われたか
NMFは手洗いデータの解釈しやすい特徴を抽出するために使用する。手洗いデータには非負の値が含まれており、NMFを適用することで手洗い動作の部分的な特徴を捉えることができる。これにより、手洗いの良し悪しを評価するための意味のある特徴量を得ることができる。

### 次元が増える理由とその意
一般的に、NMFは次元削減のために用いられますが、今回の実験では次元が増える形で適用されている。その理由と意味は以下の通りです：

- 特徴の詳細な抽出: NMFは、データを基底行列Wと係数行列Hに分解することで、データの部分的な特徴を抽出する。次元を増やすことで、より詳細な特徴を捉えることが可能になる。これにより、手洗い動作の微細な違いやパターンを捉えることができ、精度の高い特徴量を得ることができる。

- 解釈の容易さ: NMFの結果は非負の値のみを含むため、人間にとって解釈しやすい特徴を生成する。次元が増えることで、各特徴の意味を明確にし、手洗い動作の評価に役立てることができる。
### SVDとNMFの違い
SVD（Singular Value Decomposition）とNMF（Non-negative Matrix Factorization）は、どちらも行列分解の手法ですが、それぞれ異なる特性を持っている。これらの違いを明確にし、なぜ今回の実験で両方が必要なのかを説明する。

### SVDの特徴
- 非負制約なし: SVDは、行列を3つの成分に分解する際に非負制約を設けない。これにより、元のデータに負の値が含まれていても問題なく処理できる。
- 全体的な構造の把握: SVDは、データ全体の構造を把握するのに適しており、データの主成分を抽出することができる。これにより、データの最も重要な特徴を特定しやすくなる。
- 次元削減: SVDは、データの次元を効果的に削減し、重要な情報を保持しながらノイズを除去することができる。これはデータの圧縮や解析の効率化に有用である。
### NMFの特徴
- 非負制約: NMFは、分解された行列が非負値であることを強制する。これは、データが非負の値を持つ場合に特に適しており、結果として得られる特徴も非負となるため解釈しやすくなる。
- 部分的な特徴の抽出: NMFは、データを部分的な特徴に分解する能力がある。これにより、データの局所的なパターンや部分構造を明確にすることができる。
- 次元の増加: NMFでは、次元削減よりも特徴の分解・抽出を重視する場合がある。これにより、データの詳細な特性を捉えるために次元が増加することもある。

#### なぜ手洗いデータの解析において、SVDとNMFの両方を使用するのか

- 全体的な構造と局所的な特徴の両方を捉えるため: SVDはデータの全体的な構造を把握し、主成分を抽出するのに適しています。一方、NMFは局所的な特徴や部分構造を抽出するのに適している。これにより、手洗いデータの全体的なパターンと詳細な動作の両方を解析することができる。

- データの特性に応じた解析: 手洗いデータは、各動作が非負の値を持つため、NMFを使用することで解釈しやすい特徴を得ることができる。一方で、SVDを使用することで、データの主成分を効率的に抽出し、次元削減を行うことができる。

- 多様な視点からの評価: SVDとNMFの両方を使用することで、手洗いデータを多様な視点から評価することができる。SVDによって得られる主成分と、NMFによって得られる部分的な特徴を組み合わせることで、手洗いの良し悪しをより包括的に評価することができる。

# 2024-0630 実験進める
- svd, nmf, fftはできた。
-　次はやっていることの確認
# 2024-06-27 ミーティング
## タスク
- TEXで文章の修正版を書く
- 実際にやってみる

# 2024-06-27 今までやってきたことをやる
## 研究のWhy, How, What
### Why->今は社会的背景であり、学術的背景も書いてほしい。これの次に関連研究を書いてほしい->ここが1章
院内感染は解決しない大きな問題であり、CDCでは医療従事者の手によって伝播することが指摘されている。WHOも手洗いが感染管理上最も重要な対策であるとしている。COVID-19の流行時には、手洗いとマスクが主要な予防手段であり、手洗いの効果でインフルエンザの感染者も減少している。しかし、現状の学内実習では、ATP法を使用して即時性をもった清浄度の評価が可能であり、学生の手洗いテストでは合格率が27%（13/48名）に過ぎない。このことは、医療従事者も適切な手洗いができているとは限らないことを示している。したがって、院内感染を減少させるために、効果的な手洗いを特定し、促進する必要がある。そこで本研究では加速度センサーで取得したデータを元に、機械学習を用いて有効な特徴量を比較検討する。・・・(何をするか、どのように解決していくか書く。概要程度でかく。細かくは提案手法で書いていく。)
### 関連研究(セクションで深ぼるのでさらっと書く)
### How
この研究では、加速度センサーデータを使用して手洗いの良し悪しを区別することを目的としています。具体的な研究の手順は次の通りです。

#### 1. データ収集と分析
手洗いセッション中の加速度データを収集し、良い手洗いと悪い手洗いに関連するパターンを理解するために分析します。
#### 2. 特徴量抽出
良い手洗いと悪い手洗いを効果的に区別できる特徴量を特定して抽出します。特に、波形データのどの地点のデータが結果に影響を与えるかを明らかにするために、各特徴量の重要度を評価します。
- 時間軸と周波数軸の分析の比較
- XYZ軸の取り扱い方法（結合 or 和または平均）
- ハイパスフィルタとローパスフィルタの比較
- 1D FFT、3D FFT、4D FFT
- 次元削減技術：SVD、NMF、DMD
- 特徴量の重要度解析
#### 3.機械学習
抽出した特徴量のさまざまな組み合わせを用いて機械学習モデルを訓練し、最も効果的な特徴量を特定します。
- RNNと1D CNNモデルの比較
- LGBMとロジスティク回帰を用いた二値分類
- SMOTEの有無によるモデル性能の評価
### What(研究の成果)
この研究の目標は、加速度センサーデータを使用して良い手洗いと悪い手洗いを区別するための信頼性の高い特徴量を抽出することです。特に、波形データのどの地点が結果に影響を与えるかを特定し、それに基づいて有効な特徴量を抽出します。効果的な手洗いと関連する特徴量を特定することで、この研究は次の成果を目指します。
- 医療従事者の手洗い習慣の改善
- 院内感染の発生率の低減
- 手洗い手順における重要な動作を特定し、指導や訓練に役立てる

## 実際にやってみる
### 時間軸、周波数領域の相関
### クラスタリング
### ハイパスフィルタ、ローパスフィルタに分ける->する必要ある？
まずは前処理でハイパスローパス分けずに進めてみる。
### フーリエ変換
### スペクトログラム
### 行列分解
#### 特異値分解(SVD)
#### 非負値行列因子分解(NMF)
#### 動的モード分解(DMD)

## 提案手法の流れ
ユークリッドだと高さが顕著に出てしまう。
相関だと同期しているか否か
傾向がわかる。ユークリッドだと差が出るから距離が大きくなってしまう。

アドホックである場合、出た結果から選んだ理由を逆算することでそれっぽくする。これは最後にまとめる。


# 2024-06-23 やったことまとめ
どの手法を選択するかも大切だが、なぜその手法を選択するかはもっと大切。

## まとめて見て次やること
行列分解を正しく行なって、可視化する。
hi,lo,時間領域、周波数領域でどうやってデータを増やすか検討する。
## 研究の目的
- 波形データから特徴量を抽出する
- 手洗いデータから正しく洗えているか判別する
- どの地点のデータが結果に影響しているのか明らかにする
## 実験手順
### データの加工
#### フーリエ変換
時間領域のデータを周波数領域に変換するために使う。x,y,z軸でそれぞれFFTする1D FFTとx,y,zの3軸をまとめた3D FFT, 時間を加えた4Dをすることでそれぞれの手法の違いを確認する。
それぞれのFFTで数式的に何をしているか確認する。
![スクリーンショット 0006-06-23 11.53.57](https://hackmd.io/_uploads/H1G8CWS80.png)

#### 行列分解
行列分解は特異値行列分解、非負値行列分解を使った。
特異値分解は複数の行列を一つの行列にまとめることができる手法。

#### スペクトログラム
スペクトログラムとは縦軸に音の高低差を表す周波数で、横軸は時間軸を示す。点の濃さや色は音の強さを表している。時間軸で表すと見やすいのでおすすめ。
#### データの可視化
2024-05-31を参照する
> 時間軸、周波数領域の相関、1D,4D FFT、スペクトログラムのデータが可視化されている。
### 学習
#### LightGBM
#### RNN

# 2024-06-21 ミーティング
## タスク
### 加速度センサー
### Why, What, How
### 比較検討の種類
### 今までの整理
# 2024-06-20 オーバーサンプリングとクラスタリング
## プレゼン資料の作成
## オーバーサンプリングの種類
smoteが主流でsmoteの拡張アルゴリズムがあるみたい。時系列データの具体例があんまり出てこないな、、、。smoteがよく使われるデータは構造化データ
https://qiita.com/ps010/items/38880fad0b8e71464a54

結論: オーバーサンプリングはできなそう

## クラスタリング
### クラスタリングの種類
#### K-meansクラスタリングの特徴
#### 階層型クラスタリング
### クラスタリングまでの処理の流れ
#### ハイパスローパスに分ける(カットオフ0.25Hz)
#### ハイパス、ローパスの時間空間でクラスタリングしてみる
x, y, z軸の平均を処理にかける
#### ハイパス、ローパスの周波数領域でクラスタリングしてみる
#### クラスタリングの種類の違いとそれぞれの違いを考察する
# 2024-06-13 論文サーベイ
## タスク一覧
- オーバーサンプリングできる
    - smote
    - いじりすぎちゃうと正例が負例になってしまってはいけない
- クラスタリング
    - 時間軸データにはあまり適応できない？
    - 違う次元同士
    - DTW->時間データだったら
    - 波形データをクラスタリングしてみる
    - 波形をベクトルだと思ったときに類似度を測って同じグループを分ける
        - 二種類に分けれることがベスト
        - 2つに分けてみる
    - 階層型クラスタリング
    - 周波数領域だと距離とか類似度がわからない
- 手法の比較
- 少ないデータから有用な特徴量
## 関連研究
### 加速度センサー
- [3軸加速度センサを用いた歩行状態識別に有効な特徴量に関する一検討](https://www.ieice.org/publications/conference-FIT-DVDs/FIT2013/data/pdf/J-029.pdf)->特徴量に歪度、尖度、 信号パワー、零交差数、最大ピーク周波数を使っていて一番参考になりそう。予測はSVMで有効な特徴量を探している。
- [加速度データからの機械学習による行動認識](https://www.eng.u-fukui.ac.jp/wp-content/uploads/vol68_59-66.pdf)->特徴量増やさずにRNN, CNN(要確認)
- [人物の行動計測技術の開発とサービス産業への応用](https://www.gitec.rd.pref.gifu.lg.jp/files/reports/2010/information_2010_02.pdf)->周波数領域エントロピー
- [加速度センサを用いた人間の身体的特徴の推定に関する検討](https://www.jstage.jst.go.jp/article/pacbfsa/28/0/28_119/_pdf)->高校生のやつ。アドホック。


### 非負値行列分解
- [半教師あり非負値行列因子分解を用いた機械学習による環境雑音下での悲鳴検知の識別精度評価](https://www.jstage.jst.go.jp/article/jacc/65/0/65_1207/_pdf)->音声データMFCC使いがち
- [制約付き非負行列因子分解を用いた音声特徴抽出の検討](http://www.me.cs.scitec.kobe-u.ac.jp/~takigu/pdf/2008/sp0812_park.pdf)

### 動的モード分解
- [動的モード分解による多次元時系列解析](https://www.jstage.jst.go.jp/article/jnns/25/1/25_2/_pdf/-char/ja)->難しすぎた。動的モード分解を深ぼっている？

### 異常検知形
- [外れ値検出のための多変量時系列データからの特徴抽出](https://www.jstage.jst.go.jp/article/jsaifpai/111/0/111_01/_pdf/-char/ja)

### 使っている技術と手法のまとめ
音響はMFCCしか出てこないし、心拍データは移動平均が多い

# 2024-06-07 ミーティング
## 次回のタスク
- 関連研究
    - キーワード
    - 音声データ?
    - 加速度センサー
    - 行列分解
    - 波形データ
    - 時系列データと特徴量抽出
- 動的モード分解の理解と実験(もう一回)
- 動的モード分解のプレゼン資料

## 発表メモ
- はじめに
- 関連研究
- 提案手法
- 実験結果
- 終わりに(まとめと今後)
## 非負値行列分解

パーツに分けることができる
## 特異値行列分解
サンプル数✖️時間の長さでやるべき
hiだけでやってみる
パーツではなく、ざっくりとした特徴量に分解することができる
参考
https://thinkit.co.jp/article/17411
にこちゃんマークの上が非負値行列分解、下が特異値分解


# 2024-06-06 行列分解と動的モード分解の調査
## 行列分解
行列分解とは評価値行列のみでモデルを作成できる方法の一つ。推薦システムによく使われるらしい。確かにアイテムと商品という推薦システムに関係が大きそうなものが関わってくるから？行列分解の評価値とユーザー因子とアイテム因子はどちらを求めているのか？
ある行列をいくつかの行列に分解し、解釈できる特徴量を増やす。例えば[記事](https://qiita.com/yo_fuji/items/56a22c9829d40ce7a3ff)で説明していたのは、特異値分解することで`評価行列=ユーザー因子行列*アイテム因子行列`を取得することができる。
### 因子とは
列及び行が因子である。因子とは何かであって、解釈は人間がするもの。解釈(意味付)できないものもある。
### 特異値分解(SVD)
特異値分解はある行列を三つの行列に分解できる手法。
結果を出力することができた。UΣVt
### 非負値行列分解
非負の値しかインプットが受け取ってくれないから使えない。

# 2024-05-31 先方に伝えること
![image](https://hackmd.io/_uploads/HJSY7qINC.png)
![image](https://hackmd.io/_uploads/HyaO79U4A.png)


## 次回までのタスク

- 行列分解
    - 特異値分解(SVD)
        - 時間領域に適用
        - 周波数領域もやってみる
    - 非負値行列分解
        - 時間領域に適用
- 動的モードを説明できること
- 音声について
    - 特徴量の解釈を参考にできる？
    - MFCC
## 研究の目的
ユーザーに時間領域で手洗いの違いを伝える
## やったこと
- 可視化
    - 時間領域の相関
    - ![image](https://hackmd.io/_uploads/BJ_kaKU40.png)

    - 周波数領域の相関
    - ![image](https://hackmd.io/_uploads/r1QgaFL4R.png)
    - 1D FFT
    - ![image](https://hackmd.io/_uploads/ryxXptUVR.png)

    - 4D FFT
    - ![image](https://hackmd.io/_uploads/S1q7aYIVR.png)

    - スペクトログラム
    - ![image](https://hackmd.io/_uploads/Bk9NpKUEC.png)

- モデルの選定
    - Light GBM(良否の二値分類)
    - RNN(除去量を目的変数とした予測)
    - CNN(除去量を目的変数とした予測)
        - 説明変数についても説明
- 予測コードの準備
- 
    - Light GBM (良否の二値分類)
    - RNN(除去量を目的変数とした予測)
    - CNN(除去量を目的変数とした予測)
## データをいただいたらやること
- 予測コードの実行
- 分けれるか確認
    - ここで条件分岐
    - 良い結果が出た場合
    - 悪い結果が出た場合
- 特徴量の意味理解
- 逆フーリエ変換で時間領域に戻す
- 時間領域のどこに問題があるか明らかにする

# 2024-05-30 情報の可視化
## やること
- 4D FFTの可視化したコードの説明
- スペクトログラムの作成
- 行列分解、RNN、CNNを学習させる流れの確認

## 4D FFTの可視化
Time, x, y, z軸でFFTをして可視化する。標準化することで情報を確認することができた。
### 標準化とは
```
df_values = (df_values - df_values.mean(axis=0)) / df_values.std(axis=0)
```
全てのデータが同じスケール（平均0、標準偏差1）になる処理を行うこと。スケールを同じにすることで、各軸のデータが同じスケールに揃えられ、FFTの計算結果に対するスケールの影響を排除することができる。
### コード解説
### 出力結果
## スペクトログラム
### スペクトログラムとは
縦軸は、音の高さ低さを表す周波数で、横軸は時間軸を示す。点の濃さや色は音の強さを表している。
### スペクトログラムのコード解説
### 出力結果
## 行列分解
行列分解は必要ない、そもそも特徴量が少ない？
## 動的モード学習(DMD)
## RNN -> 除去率を目的変数にする
## CNN -> 除去率を目的変数にする

# 2024-05-24 ミーティング
## 話したいこと
- 目的、方針の確認
- モデルの変更

時間帯はヒントになり得るけど、どうしたらいいのか？
行動を指摘しなければならない。
手洗いデータに意味を見つける。
### TODO
- 4D FFTの可視化
- 横軸に時間、縦軸に周波数のデータをプロットしてみる。->スペクトログラム
- 時間単位でどれくらい落ちているか->たくさんのデータから検知
- 行列分解-> 元データとフーリエ変換後のデータに対して行い比較する
    - 動的モード分解->もとデータに対して行う
- RNN, CNNの検討




自分たちが出したい新規性は何？
特徴量の加工の仕方は検討事項
異常検知の文脈はあり？->確率分布
異常を排除する方法を考える

波形からわかる情報を切り取る->周波数領域だけでなく
## 先方に渡す今後の目標と目的
- スペクトログラム
- RNN, CNNに学習させてモデルにデータを入れてみる(データがないとここができない)
    - いくつかの方法で分類に貢献する特徴量を出したい
- 特徴量が得られたら逆フーリエ変換して時間領域の問題を明らかにする
    - 多分ここでは時間の情報がわかるだけで、具体的な行動を指摘することができない
- 異常検知の文脈はあり？->確率分布
- 異常を排除する方法を考える



## 考察を終えて目的の確認
> *2024-05-16*から引用
> リアルタイムで手洗いにフィードバックを送ることができる
> 1. 周波数領域のデータを変換
> 2. 前処理の結果からモデルにいれて精度がでるか確認する(今ここ)
> 3. 手洗い手法の提案？->(gan?)->手洗いのどこの時間部分が結果に影響しているか？
> 4. ユーザーに示すなら時間軸でフィードバック

とりあえず前処理の結果からモデルに入れて精度が出るか確認することができた。なるほど、この周波数の特徴量は時間領域でいうどの部分を表すことができれば研究は終わるのか？周波数領域での特徴量を時間領域に戻してフィードバックすることのギャップを埋める。特徴量を可視化する必要がありそう。
1. 周波数領域の特徴量を可視化
2. 重要度の高いデータを解釈？
行っている処理はノイズ除去くらい



# 2024-05-23 実験結果の考察

## 結論
よく手が洗われているか、洗われていないかに違いはある。
## 条件の整理
### 検証したこと
1. 時間空間で学習する
2. 周波数空間で学習する(1D FFT)
3. 周波数空間(1D FFT)をデータの大きさ、窓関数を用いて前処理した結果で学習する
4. 4D FFTのみで学習する
5. 1D FFTと4D FFTで学習する
6. 3D FFTのみで学習する
7. 1D FFTと4D FFTで学習する

| 実験No/条件 | 正規化 | 時間空間 | 1D FFT | 3D FFT | 4D FFT |
|-|--------|----------|--------|--------|--------|
| No.1 | × | ○ | × | × | × |
| No.2 | × | × | ○ | × | × |
| No.3 | ○ | × | ○ | × | × |
| No.4 | ○ | × | ○ | × | ○ |
| No.5 | ○ | × | × | × | ○ |
| No.6 | ○ | × | ○ | ○ | × |
| No.7 | ○ | × | × | ○ | × |


### 変数名について
`lo:` ローパスフィルターを通したデータ
`hi:` ハイパスフィルターを通したデータ
`real:` 実部
`img:` 虚部
`lp`: ローパスフィルタ
`hp`: ハイパスフィルた

4Dの貢献度から出力される語尾の数字は以下を表している
`0:` Time
`1:` X
`2:` Y
`3:` Z
3Dの貢献度から出力される語尾の数字は以下を表している
`0:` X
`1:` Y
`2:` Z

### 混合行列(Confusion Matrix)とは
`True Positive (TP)：`実際に正であり、モデルも正と予測したケース
`True Negative (TN)：`実際に負であり、モデルも負と予測したケース
`False Positive (FP)：`実際には負であるが、モデルが正と予測したケース
`False Negative (FN)：`実際には正であるが、モデルが負と予測したケース

よく洗えていないものを見極めるため`FP`, `TN`に注目する必要がある。
つまり誤検知を最小限に抑えることが重要なので、再現率を算出する。
<img src="https://hackmd.io/_uploads/BJpsqIhXR.png" width="200">

[ライブラリの説明](https://note.nkmk.me/python-sklearn-confusion-matrix-score/)


### 正規化について
窓関数にかけている。大きさで割ることで正規化している。
全てのデータのスケールが統一になることで、過学習を防ぐ。
[機械学習でなぜ正規化が必要なのか](https://qiita.com/yShig/items/dbeb98598abcc98e1a57)
#### 窓関数とは
入力するサンプル数Nの測定データが、0番目とN番目で連続していない場合、高速フーリエ変換すると、ノイズが出現し、周波数特性を解析しにくくなります。
この問題に対処するため、「窓処理」で測定データに窓関数を掛け、**測定データの最初と最後の点が滑かにつながる**周期関数に波形を変換します。
## 実験結果
### 実験1. 時間空間で学習する
```
Accuracy: 0.7715150690523165
Recall: 0.4044233267245505
Confusion Matrix:
[[56212  2728]
 [17423 11831]]
```
![image](https://hackmd.io/_uploads/HJneSQ3QC.png)

### 実験2. 周波数空間で学習する(正規化前)
```
Accuracy: 0.833548767489852
Recall: 0.796059857221307
Confusion Matrix:
[[25160  4369]
 [ 2971 11597]]
```
![image](https://hackmd.io/_uploads/BkgfSXhXR.png)

### 実験3. 周波数空間で学習する(正規化後)
```
Accuracy: 0.9277275098079234
Recall: 0.9046540362438221
Confusion Matrix:
[[27731  1798]
 [ 1389 13179]]
```
![image](https://hackmd.io/_uploads/SkCfr737C.png)

### 実験4. 4D FFTのみで学習する
```
Accuracy: 0.9194463353755389
Recall: 0.9022372881355932
Confusion Matrix:
[[13606  1054]
 [  721  6654]]
```
![image](https://hackmd.io/_uploads/HkamH73XC.png)

### 実験5. 1D FFTと4D FFTで学習する
```
Accuracy: 0.9820285908781484
Recall: 0.9716610169491525
Confusion Matrix:
[[14473   187]
 [  209  7166]]
```
![image](https://hackmd.io/_uploads/HkKg8mn7R.png)

### 実験6.3D FFTのみで学習する
```
Accuracy: 0.9157020291434019
Recall: 0.9181397878705466
Confusion Matrix:
[[6696  636]
 [ 602 6752]]
```

![image](https://hackmd.io/_uploads/BkYW87hXC.png)

### 実験7. 1D FFTと3D FFTで学習する
```
Accuracy: 0.973044109638773
Recall: 0.9463361481885045
Confusion Matrix:
[[7247  100]
 [ 197 3474]]
```

![image](https://hackmd.io/_uploads/S1SfIQ2X0.png)




## 考察結果
### 予測結果、再現率からの考察
#### 考察1. 時間空間の情報量の少なさ
`実験1`とその他の実験を比べてみても精度、再現率が低いことから有力な特徴量がないことがわかる。時間空間に有力な特徴量がないということは、今後も周波数領域でのデータ処理が前提になってくる。`実験1`で精度が70%であることから、時間空間に情報がないというよりは、周波数領域の方が情報があるというのが正しい解釈であると考える。

#### 考察2. 窓関数が効いている
`実験2`と`実験3`を比較すると前処理をした`実験3`の方が精度、再現率が高いことがわかる。前処理では正規化と窓関数をフーリエ変換した結果との積を取ることでフーリエ変換後のノイズを減らしている。それぞれの手洗いデータは約13000行であまり差がなく、ノイズは実際に手を洗っている時のセンサーの微妙な揺れがあることから、正規化ではなく窓関数が効いていると考えることができる。窓関数には3種類あるが、他も検証してみても良さそう。
- ハニング窓
- ハミング窓
- ブラックマン窓
#### 考察3. 今の所特徴量が増えれば予測結果が良くなる
データ数が少ないので仕方がないところではあるが、特徴量が増えると予測結果が良くなる傾向がある。予測結果が良くなる傾向は`実験3`と`実験5`、`実験3`と`実験7`から読み取ることができる。データ増やしたい。
#### 考察4. 時間の経過が重要な特徴量の一つ
`実験5`と`実験7`を比較すると`実験5`の方が精度は1%、再現率は3%高いこから、時間の経過が重要な特徴量の一つであることがわかる。実際にx, y, z軸は時間に合わせて動いているため、納得できる結果である。しかし、重要度を見ると`実験4`と`実験５`の時間軸はあまり高くないし、ハイパスフィルタの時間軸の方がローパスフィルタの時間軸より重要度が高いことがわかる。今はデータ数が十分ではないため断言できないが、データ数が増えれば時間を特徴量に入れるか否かで予測結果に差が出そう。
#### 考察5. ローパスフィルタを通したデータの貢献度が高い
全ての実験においてローパスフィルタを通したデータの重要度が高くなっている。
#### 考察6. z軸の重要度が高い傾向がある
`実験4`以外の全ての実験でz軸の重要度が高い。手洗いの軸の確認をする必要がある。z, y, xの順番で重要度が高い。また、全体を通して実部、虚部と軸はバランスよくモデルに影響を与えている。

## 今後の展望
まだ特徴量を増やせる余地がある
そもそもデータ数増やさないと話にならない？
- ケプストラム->スペクトラムの言い換えらしい
- MFCC
- メルフィルタバンク
- それぞれの窓の実装



# 2024-05-18 4D FFTの実行とその考察
## 4D FFTできた！
Timeとそれぞれの軸でFFTをしたものをすでにあるFFTの結果と合わせてLight GBMに学習させることができた。
## Time, x, y, zをまとめてFFT
### 1. 1D FFTの結果(参考)
```
データ数all_features.shape:(220484, 13)
Accuracy: 0.9277275098079234

```
### 2. 4D FFTの結果
```
データ数all_features.shape:(110172, 17)
Accuracy: 0.9194463353755389
```
### 3. 4D FFTと1D FFTの結果
```
データ数all_features.shape:(110172, 29)
Accuracy: 0.9972771827917952
```
## 考察

- `2`は`1`を1%ほど予測結果が良くなっている
    - 4次元のデータをまとめてフーリエ変換することでデータの関係を考慮するから
- それぞれのデータをフーリエ変換するのと、まとめてフーリエ変換するときの違い
    - それぞれで行うと独立した結果を得ることができる
    - データの関係を考慮することができる
    - 空間的にデータを捉えることができる
- データの量を比較
    - 今の所特徴量が多い方が良い結果が出てくる
        - かなりいいデータと悪いデータで違いがある？

## どう可視化すればいいんだろう？

# 2024-05-17 2D FFTとMFCC
## 2D FFT
### 1次元だと何をしているか
時間領域のデータを周波数領域に変換する。
縦軸である周波数成分に対する振幅が返ってくる。横軸はfftfreqで作る
### 2次元だと何をしているか
グレースケールの場合を考える。画像の輝度を波として捉えてそれの周波数を取得することができる。
参考記事：
https://vigne-cla.com/25-1/
https://qiita.com/fugunoko/items/41c33ca163c7bb52d283

### 画像のフーリエ変換前後
- フーリエ変換後に中心が低周波なのはなぜか
    - shiftを使うと低周波が中心になる
- 変換後のグラフが対照にならないのはなぜ？
    - フーリエ変換に実数を入れると虚数が返ってくる(複素共役)
        - 複素数は振幅と位相をどちらも表現することができる
        - 位相は行列の座標ではない
### 3D FFTは何をしているのか

## MFCC
### 音声情報とMFCC
## ミーティング質問事項
- ケプストラム
- MFCCの記事(プレゼン資料)探す
- フーリエ変換で周期性がわかる？
- 判別分析
- フーリエ前後で比較
- 業種で分類する->波形の特徴があるかも？
- 4D FFT
- どういう周波数がどういう行動を表しているか
    - 解釈大切
- FFTする前後に
    - 行列分解
    - DMD
## Light GBM結果
### フーリエ変換前
```
LightGBM] [Info] Number of positive: 117604, number of negative: 235171
[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.108456 seconds.
You can set `force_col_wise=true` to remove the overhead.
[LightGBM] [Info] Total Bins 1530
[LightGBM] [Info] Number of data points in the train set: 352775, number of used features: 6
[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.333368 -> initscore=-0.692990
[LightGBM] [Info] Start training from score -0.692990
Accuracy: 0.7707553801845931
Confusion Matrix:
[[56287  2653]
 [17565 11689]]
```
### フーリエ変換後
```[LightGBM] [Info] Number of positive: 58861, number of negative: 117526
[LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.113799 seconds.
You can set `force_col_wise=true` to remove the overhead.
[LightGBM] [Info] Total Bins 3060
[LightGBM] [Info] Number of data points in the train set: 176387, number of used features: 12
[LightGBM] [Info] [binary:BoostFromScore]: pavg=0.333704 -> initscore=-0.691481
[LightGBM] [Info] Start training from score -0.691481
Accuracy: 0.900673515205116
Confusion Matrix:
[[27285  2244]
 [ 2136 12432]]
 ```


# 2024-05-16 研究の目的の更新と特徴量の作成
## 目的(手順？)
リアルタイムで手洗いにフィードバックを送ることができる
1. 周波数領域のデータを変換
2. 前処理の結果からモデルにいれて精度がでるか確認する(今ここ)
3. 手洗い手法の提案？->(gan?)->手洗いのどこの時間部分が結果に影響しているか？
5. ユーザーに示すなら時間軸でフィードバック
## 時間領域と周波数領域の違い
### 時間領域
時間領域波形は振動の大きさや振動周期がわかる。
### 周波数領域
FFTによって周波数領域に変換することができる。->どうやって変換しているか数式を理解する必要がある(複素数が関係してくる)

**周波数領域からわかることは？**
各周波数成分の大きさ（振幅）がわかる。

## FFT(高速フーリエ変換)
時間領域から周波数領域に変換することでいくつか混ざった波をそれぞれ抽出することができる。フーリエ変換をすることでどの様な周波数成分がどの程度分布しているか知ることができる。性質に合わせた適切なアルゴリズムを選択することが重要である。ノイズの除去をすることで精度の高い結果を得ることができる。fftnというn次元に適応できるfftがあるらしい。

- fftfreqの出力は何？
    - 各周波数に対応する周波数軸を出力する
- これを用いると何ができるの？
    - 横軸を作って可視化することができる
- ノイズ多すぎない？
    - ハミング窓関数とフーリエ変換の結果を正規化することで軽減した
- なぜサンプル数 が2の累乗の場合のみ、高速フーリエ変換される？
    - ２つに分割して計算できるから
- 本当に時間領域での分析は無意味か？
    - 全く同じ時間に全く同じことをしているよね？その誤差を埋める必要がある気がする

ハイパスは変化が少ないところが落とされる。


## リーケージ誤差
https://mori-memo.hateblo.jp/entry/2022/04/20/234122

参考記事:
https://www.klv.co.jp/corner/fft-in-freq-analysis.html


## MFCC
長期的な変化と短期的な変化を分離することで人間の声の変化を見る。

## PCA(主成分分析)
キーワード：　周波数　特徴量　音声・音響処理
多変量解析手法のうち次元削減手法としてよく用いられる手法の一種で、相関のある多変数から、相関のない少数で全体のばらつきを最もよく表す変数を合成する。次元削減なので3軸を合わせたものに使えそう。一旦それぞれの軸に分けて特徴量を抽出したいので後回し。
## ICA
キーワード：　周波数　特徴量　音声・音響処理
これも多変量だ。後回し

## 明日やること
- 2D FFTが何ができているか具体的に確認
    - 3Dだと何が起こるか予測する
    - FFTnで1次元で使ってみる
- MFCCの内容を確認して実装
- どの向きで手の軸を決定している
- フーリエ変換はなぜ実数を入れると複素数が返ってくるのか

# 2024-04-25 研究の目的と手段
## 目的
1. 波形データから特徴量を抽出する
2. 手洗いデータから正しく洗えているか判別する
3. どの地点のデータが結果に影響しているのか明らかにする
## 手段
前処理とモデル開発の2つに分けて進める。
### 前処理
目的の1つである信号処理を使って波形データから特徴量抽出を行う。
### モデル開発
時系列モデルのAR, SARIMA, ARIMAの検証して正しい
## 来週までの目標
1. 何を使ってどの手法を使ってどんなアウトプットを求めるか言葉を明確にする。
2. 前処理を行う
    - フーリエ変換、ウェーブレット変換実行し、説明できるようにする
    - 他にどのような特徴量を作ることができるか
3. それぞれのモデルについて特徴と得意とするケースを説明できるようにする
    - AR, SARIMA, ARIMAなど



# 📘 研究の方針と課題

## 🌟 研究の背景

- 人間とAIが共に成長できる環境を作るためにはどのようなフィードバックが必要か
- この研究をすることによって人間が成長を楽しむことができ、生産性を上げることができる

LLMが出てきてAIのブラックボックス化が顕著になってきた。そんな中でAIがなぜその予測をしたのか説明することができ、次のアクションを提案することで選択肢を増やすことができる。現在、XAIはパフォーマンスの検証に使われているらしい。

## 🎯 研究目的

- 目標：説明可能性、因果推論の精度を上げ、その結果を用いて次のアクションを提案するフレームワークを作る

→人口動態をモデルとして精度を上げる過程を記録する

- 努力目標：アプリケーションに組み込み、実践的に流れをわかりやすくする

## 💡 提案するアプローチ

- 研究で使用する方法論や技術について説明します。
- どのようにして研究目的を達成するかについての概要を記述します。
- 複数のグループから特定の一員の予測をすることが目的
- **それぞれのフェーズを可視化**

### 1. データ採取（https://www.e-stat.go.jp/）

### 2. 単純な人口の推移を予測→LightGBM、時系列、地理的（空間的）な予測

- **手法**: LightGBM、時系列分析（ARIMA、SARIMA）、空間統計モデル（空間自己回帰モデル、地理的加重回帰）
- **目的**: これらのモデルを使用して、人口の推移の基本的なトレンドと地理的パターンを予測します。

### 3.  変数の分析→予測に対する変数の影響度、変数と変数の関係（特徴量エンジニアリング）

- **手法**: 特徴量エンジニアリング（新たな特徴量の生成）、特徴量選択（重要度分析）、特徴量変換（PCA、t-SNE）
- **目的**: 重要な変数を特定し、予測モデルの精度を高める。

### 4. どこのカラムが異常を起こしているかを因果推論(評価基準にする)

- **手法**: 構造方程式モデリング（SEM）、因果推論木、差分差分法
- **目的**: どの変数が異常を引き起こしているかを特定し、その影響を評価します。

### 5. 他にどのような(ベクトルの特徴？)データを入力すると精度が上がるか→すでにグルーピングされているデータのどれを入れるべきか、新たに精度を上げることができる特徴量とは何かどっちを検証する？

- **手法**: データのグルーピング分析、特徴量の追加検証
- **目的**: 予測モデルの精度をさらに高めるために、追加できるデータの種類や特徴量を検討します。

## ⚠️ **想定される課題**

### **1. データソースとデータ量**

- **課題**: 他のデータソースからのデータ採取、データ量の不足
- **解決策**: 公共データベースや民間データセットの活用、データ拡張技術の適用

### **2. モデル精度の向上**

- **課題**: 精度が低いモデルの改善
- **解決策**: 既存のデータで特徴量エンジニアリングを行い、モデルの再調整を試みる

### **3. 手法の選定**

- **課題**: 最適な予測モデルの選定
- **解決策**: 複数のモデルを試し、クロスバリデーションで評価

### **4. 因果推論の精度**

- **課題**: 因果関係の正確な特定
- **解決策**: 因果推論のための先進的な手法の適用

### **5. プロセスの可視化**

- **課題**: 研究過程の透明性と追跡可能性
- **解決策**: 可視化ツール（ダッシュボード、図表）の利用

## 🛠 解決策と戦略

- 各課題に対する予備的な解決策や対処法を提案します。
- 課題に対応するための戦略やアプローチを概説します。

## 📅 マイルストーンとタイムライン

- 研究プロジェクトの主要なマイルストーンを設定します。
- 各マイルストーンに対する簡単な説明と予定されるタイムラインを記述します。

## 🌈 予想される成果

- 研究の結果として期待される成果や成果物を述べます。
- 研究の成功がどのような影響を及ぼすかについて概説します。

## 📚 参考文献

- 研究計画の策定に使用した文献やデータソースのリスト。