音声情報処理　DPマッチング　最小距離の求め方

# DPマッチング
DPマッチングは、音声認識におけるパターン認識手法の一つであり、特に**孤立単語認識**で用いられます。この手法は、以下の特徴を持っています。

距離尺度に基づいたパターン認識：音声パターン間の距離を計算し、その最小化を目指すアプローチです。
孤立発声された単語を対象とする：連続した音声ではなく、個別の単語や短いフレーズの認識に適しています。
DPマッチングでは、**動的計画法**(Dynamic Programming：DP)を用いて、パターンの時間軸を非線形に伸縮させながら、パターン間の距離の最小値を計算します。具体的には、比較する二つの音声パターンを時間軸上で調整し、対応が最も良くなるように伸縮させます。このとき、各時刻におけるパターン間の距離を累積し、その総和が最小となる経路を探索します。

この方法により、話者の速度や抑揚の違いなど、発声時間のばらつきを吸収することができます。すなわち、同じ単語であっても発声時間が異なる場合に、それらを正しく比較・認識することが可能となります。

DPマッチングの主な利点は、計算の効率性と実装の容易さです。そのため、簡易な音声認識システムや限定された語彙の認識に広く利用されています。しかし、話者依存性が高いことや、大規模な語彙を扱う際の計算量の増大といった課題もあります。

--- 
実際にDPマッチングを用いてパターン認識を行ってみましょう
# 問題1
特徴パターンが１次元で、**Y**=(4,2,3,7,5)，**R**=(3,5,2,4)のとき，
フレーム間距離が式1で得られるとして、図1のアルゴリズムに従ってパターン間の距離を求めよ。その時のフレームの対応付けは？

---
式1
```math
d(i,j)=|y_i - r_i|
```
---
図1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/72cd925f-f3e5-0259-3df1-d4683515f047.png)

---

# 解1
以下の図を埋めていき求める。
**Y**が入力パターンで**R**が参照パターンである
入力パターンは左から**Y**(1)=4,**Y**(2)=2...,**Y**(i)
参照パターンは下から**R**(1)=3,**R**(2)=5...,**R**(j)
g(i,j)が格子点(i,j)までの最小累積距離

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/db1438db-e1ba-3f93-2858-9008f297592d.png)
</br>

Step1:g(1,)を埋める。
---

g(1,1) = d(1,1) = |4-3| = 1
それ以外は∞である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/1b8f19c5-4cb2-b7fa-a2ee-f8534acce90c.png)

Step2:d(i,j)を求める
---
g(i,j)を求めるための準備としてd(i,j)を求める。
d(i,j)の値はマスの右上にメモしておくと良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/2ea8d0d3-5293-78e8-f6a4-ca95bb88e28b.png)

Step3:g(i, j)を求めていく
DPのパスが図1の時，g(i, j)(i > 1)は以下の式で表せる
```math
g(i,j) = \min \begin{Bmatrix} 
g(i-1,j) \\
g(i-1,j-1) \\
g(i-1,j-2)
\end{Bmatrix} + d(i,j)
```
**イメージ:g(3,3)のとき**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/d655faa4-b8ed-ba4a-828a-68af3b727ad6.png)

DPパスが図1の通り以下のものであるため、これをイメージしながら計算する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/4b2e88a2-4916-3640-3a49-ea50b5a0dd01.png)

g(3,3)においては以下図のようになり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/294c6567-5fdf-c02c-741a-6d4627afcfc8.png)

1,4,2の中で一番小さい1とd(3,3)の1を足して1+1=2となる。

同様にしていき，結果以下図になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/0d7d564c-4a31-ba62-71b4-d6f393d3def8.png)


:::note info
- g(2,)は、j = 1,2,3 → g(2,j)=g(1,1)+d(2,j)となり、j>3 → g(2,j)=∞となる
- g(,1)は必ずg(i,1)=g(i-1,1)+d(i,1)となるので、先に埋めていると楽
:::

Step4:仕上げ
----
全てのg(i,j)を求めることができたので、パターン間距離とフレームの対応付けを求める。
最終的な距離が最小となる経路は以下図のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/80a19679-a4f3-64b9-6d05-81a108a91e18.png)

***パターン間距離***
```math
D(Y,R) = \frac{g(I,J)}{I} \\\\\
= \frac{最短距離時のg(5,j)}{入力パターン総数} = \frac{4}{5}
```

***フレーム対応付け***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/92090304-3a06-507d-c7e3-488ccd7f4d5e.png)

# 問題2
問題1と同様の時に、DPパスが図2の場合のパターン間の距離とその時のフレームの対応付けを求めよ。

---
図2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/36b88865-5136-da6a-c0f7-2b476d4bcc46.png)
---

# 解2
基本は解1と同様に進めるがDPパスが対象型DPパスであることに注意する。

Step1:g(1,)を埋める。
---

g(1,1) = 2d(1,1) = 2 x |4-3| = 2
それ以外は∞である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/bc14e04e-5f31-23e1-c2aa-bd372abfefb0.png)

:::note alert
g(1,1) = 2d(1,1) x2を忘れない！！
:::


Step2:d(i,j)を求める
---
g(i,j)を求めるための準備としてd(i,j)を求める。
d(i,j)の値はマスの右上にメモしておくと良い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/3a25ba1f-e5c5-0e92-1e16-4c720b417cfa.png)

Step3:g(i, j)を求めていく
---
DPのパスが図1の時，g(i, j)(i > 1)は以下の式で表せる
```math
g(i,j) = \min \begin{Bmatrix} 
g(i-1,j) + d(i,j)\\
g(i-1,j-1) + 2d(i,j)\\
g(i,j-1)+ d(i,j)
\end{Bmatrix}
```
**イメージ:g(2,2)のとき**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/6531fcfb-e6dc-1a53-4c09-a921416c0f20.png)

DPパスが図2の通り以下のものであるため、これをイメージしながら計算する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/923affe3-9210-7a04-9c04-8d7ff006c223.png)

g(2,2)においては以下図のようになり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/e7b0f6ed-35c8-58df-b60e-d0ecd748e60c.png)


右からくるのは、∞ + 3 = ∞
斜め下からくるのは、2 + 2x3 = 8
下からくるのは、3 + 3 = 6
で最小はしたからくる6であるため、g(2,2) = 6

同様にしていき，結果以下図になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/dce2909e-4ae9-6a7d-1d44-14338ad258a3.png)

Step4:仕上げ
----
全てのg(i,j)を求めることができたので、パターン間距離とフレームの対応付けを求める。
最終的な距離が最小となる経路は以下図のようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/5fc35e07-6601-9a0f-7fd0-65e6b058b2f8.png)


***パターン間距離***
```math
D(Y,R) = \frac{g(I,J)}{I} \\\\\
= \frac{最短距離時のg(5,j)}{入力パターン総数} = \frac{7}{5}
```

***フレーム対応付け***
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/92090304-3a06-507d-c7e3-488ccd7f4d5e.png)