Python何も分からなかった状態の基礎編、重く苦しい数学編をなんとか超えてついに機械学習編にたどり着きました!基本も数学も適宜振り返る必要があると思われ、何も分からなくて苦しいのは今後も続くと見込まれますが、とにかく本編がやっとスタートします。教師あり学習とは教師あり学習については過去の記事で以下のように触れました。AIは人間に何をもたらすのかそもそも教師あり学習とは、人口知能アルゴリズムを教師あり学習と教師なし学習で分類したときの一つになります。教師あり学習は、正解ラベルのついたデータセットを用意し、それを学習させることにより、人口知能モデルをつくることとなります。教師あり学習はさらに大きく分類問題と回帰問題に大別されます。今回のテーマは回帰です。機械学習における回帰は統計学における回帰とほぼ等価と捉えて問題なさそうです。ここで言う回帰とは、数値を予測することになります。データセットから特定の規則を探し出し、結果を予想することになります。単純なケースでは、複数のプロットから一次関数を導きだし(線形回帰)、xからyの値を求めるようなことになると思われます。データセット線形回帰モデルは、現時点では特定のデータセットから関数を導出したモデルと捉えています。サンプルとしてデータセットを用意します。データセットを用意する今回はリソース数は少ないですが、本ブログを題材にしたいと思います。Googleアナリティクスよりページビュー数とユーザ数を取得してその関係を扱ってみます。データはどっかのDBに保存して解析できるようにしたいけどそれはいずれかなぁ。1084]235上記例では「npy.savez」によりデータを「.npz」ファイルに保存しています。保存したファイルは対象ソースが存在するフォルダ(ディレクトリ)に保存され、以降いつでもデータを読み込むことができます。読込みは「npy.load」により行い、「.npz」形式で保存している場合にはロードしたデータはJSON形式に似た扱い方でそれぞれのデータを取り出すことができます。適切なデータがない場合は、ランダムで適当な数値を生成すればよいでしょう。データセットのグラフを表示する生成したデータセットをグラフ上に散布図で表現してみます。プロットは「plt.plot」により行います。モデルを求める方法としては、「最小二乗法」と言われる方法が有名です。ここでは、Pythonで最小二乗法を理解しながら、プログラミングによりそれらしい概ねの結果を求めてみたいと思います。最小二乗法をPythonで理解する今、何がしたいかと言うとプロットを行ったデータから、最もらしい一次関数を求めることです。以下の式の傾き「w0」と切片「w1」を求めることになります。最小二乗法は誤差Jを以下の式により表します。意味は後からひも解いてみます。ここでも「yn」は「y=w0x+w1」で表せられるn番目の一次関数のことで以下の通り表現されます。w0とw1は重みと言われるもので、これらが決まると誤差Jを求めることができます。w0及びw1とJの関係性をグラフにより図示してみます。fontsize=8)plt.grid(True)plt.show()・出力結果なにをやっているか分かるでしょうか?私は以下の値をいじっているうちに何となく分かってきました。1000]これは何を表しているのでしょうか。そもそも最小二乗法はグラフ上の以下を表しています。ここでは元のデータのプロットの縦の大きさを「t」として直線の縦の大きさを「y」としています。(y-t)は学習データのプロットと直線の距離を表しているということになります。プロットは直線に対して上にずれたり、下にずれたりするため、そのままとるとプラスとマイナスの値が混ざってしまうため全て正の数として扱うために2乗しています。Σを使用することで全プロットと直線の距離合計を求めていることになります。これに「1/N」をかける、つまり要素の数で割っていることに等しいので平均を求めていることになります。これがこれまで誤差と呼んでいたJの正体ということになります。全てのプロットが直線上に存在する場合を求められるならばこの値はゼロになります。最小二乗法とは、この誤差Jが最小になるw0とw1の組み合わせを探す方法です。今回は参考書に沿って平均値で求めていますが、単なる合計値で求めたとしても最小になる点というのは変わらないので、平均をとらない場合もあるということです。ここまでくると分かってきます。上記のPythonプログラムでは以下の範囲で、直線を生成していき誤差を調べています。1000]このことから、三次元のグラフや高等線から、誤差Jが最小になりそうなポイント(w0とw1の組み合わせ)がなんとなく分かるわけです。高さの軸が一番小さいところが今求めているポイントです。これは高等線が分かりやすく、一番小さい範囲に合わせて「w0とw1の範囲」を調整していくとさらに詳細が分かってくるわけです。?なんとなく伝わりましたかね?Pythonで概ねの値を求める先ほどの最小二乗法のプログラムを用いて、概ねの答えを求めてみましょう。今回試している範囲と粒度にはなりますが、一応答えらしきものを算出することができました。求めた関数をデータプロット上に図示してみます。Y軸に名前を付けるplt.ylabel('$users$')plt.grid(True)・出力結果グラフ上で見ても概ね正しそうであることが分かります。この関数からビュー数とユーザ数の相関関係が分かりますので、例えばページビュー数が10000回の場合、どの程度のユーザに見てもらえることになるかを推測することができます。19525.]ページビュー数が10000回となるのは私のブログの場合はユーザ数6394人が必要になると推測できます。上記の方法でもそれらしい線形回帰モデルを求めることができました。今回の方法では、あくまで今回用意したw0とw1の組み合わせから最も誤差が小さいものを選択した形となっています。全パターンの中から厳密な組み合わせを求めることができていません。線形回帰などの考えは数学的な根拠に基づいていますので、数学的に求めることはもちろん可能です。ここでは詳細な計算は省きますが、その流れと考え方だけ示してみたいと思います。式は上記を元に以下を用います。ここで「y」を置き換えると以下のようになります。xとtは自分が用意したデータセットから値を代入することができます。n=0のときは「x=235、t=24」といった具合にn=7までの値を入れることができ、今回のケースではこれが8つ並ぶことになります。この計算を進めるのはしんどいので今回は行いませんが、重要なのは誤差Jを変数w0とw1の式として表現できるということです。ここで、誤差Jが最小になるw0とw1の組み合わせを求めるために何をするのかというとw0とw1のそれぞれで偏微分を行います。w0とw1のそれぞれで偏微分した結果が0になる場合を求めます。0になる場合というのはつまり誤差Jが最小になるときです。偏微分がしっくりこなくても、二次関数の微分で最小を求めるときと同じようなものなんだなぁと思えばよいと思います。ここまでやっても変数w0とw1が残ったままですが、2本の式に変数2つということで連立方程式の問題に落とし込むことができ、数学的なアプローチにより最適な答えを導くことができるということが分かります。今回のサンプルデータレベルでも実際に解くのはなかなかしんどいと思います。実用レベルのことを考え、データセットの個数が増えたり、そもそも要素が「w0、w1、w2、w3・・・」と増えていくと手動で解くのは現実的とは言えないと思います。プログラムを中心に据えて取り組む場合にはこれを頑張って解くというよりは、重要なのは中で何に基づき何をやっているか、どのようなものを求めているのかを知っておくことではないかと思っています。苦労した後には楽をしましょう。この苦労が本当に必要かは私からは判断できませんが、ただ使用するよりは格段の感動が味わえます。最小二乗法の解は「numpy.linalg.lstsq」関数を用いることで傾きw0と切片w1が求められるようです。-130.731用意された関数なので、注意点としては引数と戻り値の形が決まっていることでしょうか。これによりかなり簡単に最小二乗法の解を求めることができるようになりました。その6(指数対数)またまたしばらくサボっていました。その5(行列2)長くなってきたので一旦切りました。回帰編(多次元モデル)【Docker】sudoなしでDockerコマンドを実行する月別アーカイブはてなブログをはじめよう!wantanBlogさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。