マルコフ連鎖で遷移(ランダムウォーク)するプログラム

<a href="https://qiita.com/murasaki1994/items/86d1c4adada224b0c545">前回</a>マルコフ過程のプログラムを作って確率を出すまでやりました。

https://qiita.com/murasaki1994/items/86d1c4adada224b0c545

そのため今度はその確率から遷移するプログラムを作ってみました。

# 関数
## マルコフ過程
```Python3
import pandas as pd
def marcov(arr):
    dic = {}
    for i in range(1, len(arr)):
        if arr[i-1] in dic:
            if arr[i] in dic[arr[i-1]]:
                dic[arr[i-1]][arr[i]] = dic[arr[i-1]][arr[i]] + 1
            else:
                dic[arr[i-1]][arr[i]] = 1
        else:
            dic[arr[i-1]] = {}
            dic[arr[i-1]][arr[i]] = 1
    col = []
    sumval = {}
    for val in dic:
        col.append(val)
        for val2 in dic[val]:
            col.append(val2)
            try:
                sumval[val] = sumval[val] + dic[val][val2]
            except:
                sumval[val] = dic[val][val2]
    col = list(set(col))
    for val in dic:
        for val2 in dic[val]:
            dic[val][val2] = dic[val][val2] / sumval[val]
    table = []
    for val in col:
        tmp = []
        for val2 in col:
            try:
                tmp.append(dic[val][val2])
            except:
                tmp.append(0)
        table.append(tmp)
    df = pd.DataFrame(table)
    df.columns = col
    df.index = col
    return df, dic
```
## マルコフ連鎖
```Python3
import numpy as np
def marcov_pred(dic, start, length):
    state = start
    flow = [state]
    for i in range(length):
        if state in dic:
            next_state = list(dic[state].keys())
            proba = list(dic[state].values())
            state = np.random.choice(next_state, p=proba)
        else:
            break
        flow.append(state)
    return flow
```
# プログラムとデータ
## 元のデータとプログラム
```Python3
moji = ["A", "B", "A", "A", "B", "C", "B", "A", "B"]
df, dic = marcov(moji)
df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/9d510fdf-8fb5-18c1-5d55-2ee641732fe0.png)

```Python3
dic
```
```
{'A': {'B': 0.75, 'A': 0.25},
 'B': {'A': 0.6666666666666666, 'C': 0.3333333333333333},
 'C': {'B': 1.0}}
```
## マルコフ連鎖で配列を生成
```Python3
pred = marcov_pred(dic, "A", 100)
for i in range(1, len(pred)):
    if i % 10 == 0:
        print(pred[i], end="\n")
    else:
        print(pred[i], end=" ")
```
```
A B A B A B C B A A
A A B A B A B A A A
B C B C B A B C B A
B C B A B C B A A B
C B A A B A B A A B
A B A B A A B A B C
B A B A A B A B C B
A B A B A B A A B C
B C B A A B A B C B
A B A B A B C B A B
```
見にくいので10データで改行しています。
ところでこれは各ステップで次の状態が現在の状態にのみ依存しておりランダムに移動しているため「ランダムウォーク」と言います。
```Python3
df, dic = marcov(pred)
df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/a387e6c3-bc51-163a-4318-b778097649c6.png)

いっぱい動かした結果マルコフ過程が若干変わっていることが分かると思います。
ところでベイズ統計学には今回のマルコフ連鎖と似た言葉で「マルコフ連鎖モンテカルロ法」というものがあります。
1. 初期のデータを元に確率モデルを作成
2. モデルのパラメータを反復的に推定
3. 確率分布から新しいデータポイントを生成し、そのデータを用いてさらにモデルを精密化

というデータサイエンスの考えがこのマルコフ連鎖の応用というのは補足です。
```Python3
dic
```
```
{'A': {'B': 0.6530612244897959, 'A': 0.3469387755102041},
 'B': {'A': 0.7560975609756098, 'C': 0.24390243902439024},
 'C': {'B': 1.0}}
```
# 応用
MATLABの機械学習についての<a href="https://jp.mathworks.com/discovery/machine-learning.html">ページ</a>から文章をコピーしてランダムウォークで文章を生成してみます。
```Python3
from janome.tokenizer import Tokenizer
t = Tokenizer()
text = """
なぜ機械学習が重要か

ビッグデータの増加に伴い、機械学習は以下のような分野の問題を解決するための重要な技術となっています。
画像処理とコンピュータービジョン:

カメラ等で取り込んだデジタル画像から、意図した情報を取り出すために処理加工を行うために機械学習が応用されます。情報を取り出す画像解析とその解析をしやすくするために行う前処理を合わせて指すのが一般的です。画像処理はノイズを取り除いてきれいな画像を出力する以外にも、最近では、コンピュータ上で特定の物体を見つける画像認識の活用が増えています。人間の視覚による直感的な判断をコンピュータが行えるようになることで、これまで人による目視検査に頼っていた生産ラインでの外観検査等をコンピュータによる画像検査に置き換える動きが進んでいます。

その応用は医用画像、顔認識、文字認識(OCR)といったより高度な対象に広がってきており、ロボット産業の市場拡大の傾向から、ロボットの目(画像のセンサ)として動体検出や３次元画像処理を取り扱うコンピュータビジョンという研究分野として発展しています。
予知保全:

故障が発生する前の適切なタイミングでメンテナンスを行い、コストを最適化する点でも機械学習の技術が応用可能で、これは予知保全 (Predictive Maintenance) と呼ばれています。一般的に、機械のメンテナンスは、故障が発生した後に実施する事後保全や、一定期間経過した後に定期的にメンテナンスを行う予防保全（例えば車検）があります。一方で予知保全は、データから機械の状態を正しく判断した上でメンテナンス時期を決定するため、余計なメンテナンスを減らす事によるコスト削減だけでなく、突発的な故障を避けられ安全性の向上にも繋がると期待されています。IoT技術の進展に伴い機器へのセンサー導入率が高まることで、予知保全は業界問わず様々な分野で応用が可能です。
自然言語処理:

テキスト認識、音声認識アプリケーション、OCR

人間の言語（自然言語）を機械学習を使用して処理します。普段の会話で使用される話し言葉から、文章と論文のような書き言葉までを自然言語の対象として、それらの言葉が持つ意味を解析し、言葉の意味の分類等を行います。自然言語処理技術を使い、問い合わせに対応するチャットボット等の事例があります。
情報生命科学:

医療診断、創薬

生命科学やヘルスケア分野では、多種多様なセンターが開発、普及することで、様々なデータが大規模に蓄積されることで機械学習の適用範囲が広がっています。主に医療診断、病理画像解析、腫瘍摘出、創薬標的同定、新薬分子設計、化粧品の開発などにおいて、機械学習を活用した医療、創薬の実用化が広がっています。
エネルギー生産:

電力会社にとっては、コストを最小にして運用の効率化と信頼性を最適化するために、正確な電力需要の予測が不可欠です。機械学習の技術を使用し、モデル化による電力需要予測を行うことが可能です。
金融工学:

数理ファイナンスおよび機械学習手法を使用して、トレード、ヘッジ、投資、およびリスク管理に関する意思決定をサポートします。

金融工学では、売り手側の金融商品に対する価格付け、評価、およびリスク分析に従来から機械学習が関連しています。

具体的な機械学習の活用事例として、銀行、ヘッジ ファンド、資産運用会社の研究者、クオンツ、アナリストが、金融商品の価格付け、金利の分析、利回り曲線の作成と分析、確率的ボラティリティ モデルの分析等などが挙げられます。

特に、アルゴリズム取引についても機械学習が用いられています。アルゴリズム取引では、電子金融市場において、自動的に株式売買注文のタイミングや数量を決めて注文を繰り返すアルゴリズムを使って取引の決定を行います。売り手と買い手双方に適用できるアルゴリズム取引は、高速取引や高頻度取引、為替取引、および関連のリスクと実行分析の基盤を形成します。
機械学習とディープラーニングの違いとは

AI（人工知能）が最も広義の概念となり、機械学習はAIに含まれます。ディープラーニングもまたAIの一部であり、機械学習のアルゴリズムの1つでもあります。機械学習とディープラーニングの違いを端的に説明すると、情報処理能力、速度の差が挙げられます。


機械学習では一般的に、特徴量（予測や分類に利用される数値や画像等のデータセット）を人間が定義します。一方、ディープラーニングでは、後述するニューラルネットワークの技術を応用することで膨大な特徴量を自動で学習をしてくれます。そのため、高い精度で予測や分類ができ、特に音声や言語、画像認識の領域で利用されています。
機械学習とディープラーニングのどちらを選択すべきか？

機械学習は、用途、処理するデータのサイズ、解決したい問題の種類に応じて、さまざまな手法やモデルを選択することができます。一方、ディープラーニングを成功させるには、モデルを学習させるための非常に大量のデータ（数千枚の画像）と、データを高速に処理するためのGPU（グラフィック・プロセッシング・ユニット）が必要です。

そのため、高性能のGPUと大量のラベル付きデータのどちらも持っていない場合は、ディープラーニングではなく機械学習を使う方が理にかなっているかもしれません。ディープラーニングは一般に複雑なので、信頼できる結果を得るためには、少なくとも数千枚の画像が必要です。

機械学習を選択した場合、多くの異なる分類法でモデルを訓練するオプションがあります。また、どのような特徴を抽出すれば最良の結果が得られるかを知っておくこともできます。さらに、様々なアプローチを組み合わせて、異なる分類器や特徴を使い、どの配置がデータに最も適しているかを確認する柔軟性もあります。
機械学習が効果を発揮するのは？

機械学習では、より多くのデータがあるほど、より良い回答を導出します。

機械学習アルゴリズムは、データの中に自然なパターンを見つけてそこから洞察を生み出し、より良い意思決定と予測を行う手助けをします。これらは、医療診断、株取引、エネルギー負荷予測などの重要な決定を行うために毎日使用されます。 たとえば、メディアポータルは機械学習を利用して何百万もの選択肢からあなたにおすすめの歌や映画を提供しています。 小売業者は、顧客の購買行動から洞察を得るために機械学習を使用しています。
機械学習をいつ使うべきか

所定の数式や方程式が存在せず、大量のデータセットと多数の変数が含まれている複雑なタスクや課題がある場合は機械学習の使用を検討しましょう。仮に次のような状況に対処する必要がある場合は、機械学習が適しています。
機械学習の仕組み

機械学習には2種類の手法が使用されます。一つは既知の入力データと出力データを用いてモデルを訓練し、将来の出力を予測できる「教師あり学習」、もう一方は、入力データの隠れたパターンや固有の構造を見出す「教師なし学習」です。注目を集めているディープラーニングは「教師あり学習」、「教師なし学習」のどちらでも応用可能な、機械学習に含まれるアルゴリズムの1つです。

教師あり学習

教師あり機械学習は、不確実さがあっても証拠に基づいて予測を行うモデルを構築します。教師あり学習のアルゴリズムは、すでにある一連の入力データとそれに対する応答（出力）を用いてモデルを訓練し、新たなデータへの応答を合理的に予測できるようにするものです。予測しようとする事象について、既存の応答（出力）データがある場合は、教師あり学習を使用します。

教師あり学習では、分類や回帰の手法を用いて予測モデルを作成します。

教師なし学習

教師なし学習は、データに内在する隠れたパターンや固有の構造を見いだすものです。ラベル付けされた応答を持たない一連の入力データから推論を導き出すために用いられます。クラスタリングは、最も一般的な教師なし学習手法です。これは、探索的データ分析により、データ内の隠れたパターンやグループ構造を発見するために用いるものです。クラスタリングは、遺伝子配列解析、市場調査、および物体認識などに活用されています。たとえば、携帯電話会社が携帯電話の中継塔の位置を最適化したい場合、中継塔の利用者のクラスター数を見積もるために機械学習を使うことができます。携帯電話が一度に接続する中継局は1カ所のみのためクラスタリングアルゴリズムを使用して、顧客のグループまたはクラスターが最適化された信号受信を受けるために最適な中継塔の配置を設計します。

クラスタリングを実行するための一般的なアルゴリズムには、k平均法およびkメドイド、階層クラスタリング、混合ガウスモデル、隠れマルコフモデル、自己組織化写像、ファジィ c 平均クラスタリング、および減法クラスタリングなどが含まれます。
機械学習アルゴリズムをどのように決めるか？

機械学習には様々な手法があります。適切な機械学習のアルゴリズムを選択するのは、手に負えない難題に思えることもあります。教師あり、教師なしの機械学習アルゴリズムは何十種類もあり、学習方法もそれぞれ異なるからです。
「教師あり学習」と「教師なし機械学習」の選択に関するガイドラインは次のとおりです。

    予測（例えば、温度や株価などの連続型変数の将来値の推定）や分類（例えば、ウェブ動画に映っている自動車の型式の特定）を行うモデルの学習が必要な場合は、「教師あり学習」を選択します。
    入力データを詳しく調べる必要がある場合や、データをクラスターに分けるなど、データの適切な内部表現を見出すモデルの学習が必要な場合は、「教師なし学習」を選択します。

最も優れた手法や、何にでも使える手法というものはありません。適切なアルゴリズムを探すには、試行錯誤に頼らざるを得ない部分があります。極めて経験豊富なデータサイエンティストでも、あるアルゴリズムがうまく機能 するかどうかは、結局のところ試してみないと分からないのです。ただしアルゴリズムの選択は、扱うデータのサイズや種類、データから導き出したい見解、その見解の活用方法によって決まってくる部分もあります。
"""
tokens = t.tokenize(text, wakati=True)
df, dic = marcov(list(tokens))
```
```Python3
pred = marcov_pred(dic, "機械", 1000)
for i in range(len(pred)):
    print(pred[i], end="")
```
```
機械学習の中に分けるなどが発生するためには、より良い回答を取り除いてくれます。適切な機械学習にはAI（グラフィック・プロセッシング・ユニット）が含まれる話し言葉から洞察を知っています。教師あります。注目を選択に関するガイドラインは、データが不可欠です。

機械学習を応用可能です。


機械学習」、コスト削減だけで予知保全は様々な教師なし学習を行う予防保全:

機械のために最適な特徴量（例えば、データを最小には医用画像からです。情報生命科学:

機械学習された情報を取り扱うコンピュータによる電力需要のサイズや、創薬

最も広義の市場調査、探索的です。ラベル付けさせるためにメンテナンスを選択に関する意思決定するの問題を学習

故障が含まれてきて指すの手法や株価などの差が発生しています。
情報を避けられています。ラベル付けされた場合や分類が必要です。予測しよう。適切なアルゴリズムの選択肢から、OCR) 小売業者は「教師ありません。IoT技術があり学習にも持っています。予測を利用者、データへの結果が得ない難題に処理を最適化とディープラーニングの適切な中継局は、高い精度でもあり学習

教師あります。

数理ファイナンスおよび物体認識の向上にし、およびリスクとなっています。
金融市場拡大の中継塔の対象として動体検出や、結局の決定とディープラーニングで取り込んだデジタル画像）を使用してきています。機械の選択肢からです。ただしアルゴリズムは以下の将来の言葉が携帯電話会社の異なるから洞察を最適化する隠れた生産:

教師なし学習」です。

クラスタリング、文字認識の一般的な状況に株式売買注文の応答を最小に思えることで使用します。
機械学習」の技術を選択します。
機械学習」、顔認識のです。携帯電話会社にとっては、学習の1カ所のみの入力データと信頼できる「教師なし学習で膨大な特徴量を行う手助けを行うための会話で応用は、為替取引、文字認識の重要なセンターがある場合、売り手側の応答（予測（例えば、「教師あり学習を組み合わせています。画像解析、機械学習は予知保全や分類や固有の学習」の一部で、最近で、速度のタイミングや、教師なし学習を合わせています。仮に次の物体認識の手法が可能でもあり学習」、データへの手法を自然言語のは「教師あります。注目を行う手助けを見つける画像が一般に活用があっています。極めて経験豊富なメンテナンスを使用される数値や固有の歌や分類（例えば車検）がうまく機能 たとえば、言葉が開発などの配置が含まれた場合は、用途、およびリスク管理に関するガイドラインは、データにもあり機械学習」と呼ばれます。主に含まれます。

クラスタリングを選択し、最近では医用画像処理する事象について、コストを解析、ロボット産業の技術とそれに対する価格付け、創薬標的同定、最近では、化粧品の目(Predictive と分析、多種多様なメンテナンスを使用されます。注目を行う予防保全やグループまたはクラスター数を使用しています。画像等などに負えないの違いとなっています。

AIの適切な場合は、どのような中継局は、特徴量を取り出すため、画像処理するために医療、多種多様なタイミングや言語（人工知能）や特徴を見いだすものは、用途、階層クラスタリングは、市場調査、病理画像認識(Predictive たとえば、為替取引、信頼できるような技術を利用しています。
金融商品のラベル付きデータの利用してきているディープラーニングは、顧客の分析、より良い意思決定を発見するために応じてそこから機械学習が発生するためにもできます。人間の研究者の違いと大量の領域でもあり学習」を設計し、特徴を予測モデルを活用方法によって決まっています。

最も広義の視覚による電力需要の中に大量の作成となってくれます。クラスタリングを応用可能で利用されます。
機械学習」、モデルのです。
自然言語（数千枚のセンサ)として発展しており、さまざまなアルゴリズムを選択したパターンや方程式が携帯電話会社にとっては

機械学習を学習を最適化による画像認識の実用化していた信号受信を高速にメンテナンス時期を詳しく調べる必要です。

その応用が増えている自動車の使用します。
機械学習
```
文章に違和感はありますがそれっぽい文が出来上がっている事が分かります。何となく機械学習の事を言っていることは分かると思います。
これは文章生成に使いましたが、他にも楽曲のコードがあればそこから少ない情報で作曲生成なども行うこともできます。

# まとめ
なんとなく学ぶマルコフ連鎖が実は生成AIの初期のもので研究されていたり現在も自然言語処理に使われていたり、さらに応用したものがベイズ統計学で使われているなどすごいですね。

# 参考文献というか文章引用元
機械学習とは？仕組み、手法、学び方から利用例まで - MATLAB &amp; Simulink
https://jp.mathworks.com/discovery/machine-learning.html