<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>機械学習 on M1KE BL0G</title><link>https://www.m1ke.org/tags/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/</link><description>Recent content in 機械学習 on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><lastBuildDate>Mon, 24 Mar 2025 16:35:55 +0900</lastBuildDate><atom:link href="https://www.m1ke.org/tags/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92/index.xml" rel="self" type="application/rss+xml"/><item><title>Excelで学ぶ最小二乗法</title><link>https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/</link><pubDate>Mon, 24 Mar 2025 16:35:55 +0900</pubDate><guid>https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/</guid><description>&lt;img src="https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/lsm.jpg" alt="Featured image of post Excelで学ぶ最小二乗法" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;機械学習を始めた頃に作った、5年前のスプレッドシートを見つけた。&lt;/li&gt;
&lt;li&gt;内容は、最小二乗法の考え方を使って、キロメートルをマイルに変換する係数を求めるものだった。&lt;/li&gt;
&lt;li&gt;久々に見返してみると、単純な例ではあるものの、最小二乗法や機械学習の基本を理解するにはちょうどよい題材だった。そこで、あらためて内容を整理しておく。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="昔のファイル"&gt;昔のファイル&lt;/h2&gt;
&lt;p&gt;Excelで、キロメートルからマイルへの変換係数を求めるファイルを作っていた。&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/supushi.png"
width="1175"
height="171"
srcset="https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/supushi_hu_ba0c9f3b9e3a5a80.png 480w, https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/supushi_hu_f521a25c4462c27a.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="687"
data-flex-basis="1649px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/excel.png"
width="1490"
height="560"
srcset="https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/excel_hu_783f7370a7aa38af.png 480w, https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/excel_hu_b8cf973bb5455b35.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="266"
data-flex-basis="638px"
&gt;&lt;/p&gt;
&lt;h2 id="解説"&gt;解説&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今回やることは、&lt;strong&gt;キロメートルをマイルに変換する係数&lt;/strong&gt;を、最小二乗法の考え方で求めることである。&lt;/li&gt;
&lt;li&gt;たとえば、100km は約 62.137mile である。&lt;/li&gt;
&lt;li&gt;つまり、本来の変換式は次のようになる。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
mile = km \times 0.62137
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この $0.62137$ が、キロメートルをマイルに変換するための係数である。&lt;/li&gt;
&lt;li&gt;ただし今回は、この係数を最初から使うのではなく、Excel上で少しずつ係数を更新しながら、正しい値に近づけていく。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="やりたいこと"&gt;やりたいこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;キロメートルを $x$、マイルを $y$ とする。&lt;/li&gt;
&lt;li&gt;変換式を次のように置く。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
y = ax
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ここで、$a$ が求めたい係数である。&lt;/li&gt;
&lt;li&gt;今回の教師データは次の通りである。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
x = 100
$$&lt;/p&gt;
&lt;p&gt;$$
t = 62.137
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$t$ は正解データ、つまり教師データである。&lt;/li&gt;
&lt;li&gt;求めたいのは、次の式を満たす $a$ である。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
62.137 = a \times 100
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;普通に計算すれば、次のようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
a = \frac{62.137}{100} \\
a = 0.62137
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;つまり、正解となる係数は $0.62137$ である&lt;/li&gt;
&lt;li&gt;しかし今回は、あえてこの値を直接求めず、Excelで学習させるようにして近づけていく。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="最小二乗法とは何か"&gt;最小二乗法とは何か&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;最小二乗法とは、&lt;strong&gt;予測値と正解値のズレを二乗し、その値がなるべく小さくなるようにする方法&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;今回の予測値は $ax$&lt;/li&gt;
&lt;li&gt;正解値は $t$&lt;/li&gt;
&lt;li&gt;したがって、誤差は次のようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
ax - t
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この誤差を二乗したものが、今回小さくしたい値となる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
(ax - t)^2
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Excelでは、この誤差の二乗がだんだん小さくなっていく様子をグラフで確認している&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="予測値を計算する"&gt;予測値を計算する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;まずは、現在の係数 $a$ を使って予測値を計算する&lt;/li&gt;
&lt;li&gt;数学の式で書けば次の意味になる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
y = ax
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最初は当てずぽうの係数を当てはめる&lt;/li&gt;
&lt;li&gt;たとえば、最初の係数を $a = 0.1$ とする&lt;/li&gt;
&lt;li&gt;すると結果は、次のようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
y = 0.1 \times 100 \\
y = 10
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;つまり、最初の予測では、100km を 10mile と予測していることになる&lt;/li&gt;
&lt;li&gt;しかし、本当の値は 62.137mile である&lt;/li&gt;
&lt;li&gt;この時点では、かなり大きく外れている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="誤差を計算する"&gt;誤差を計算する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;E列では、予測値と正解値の差を計算する&lt;/li&gt;
&lt;li&gt;これを、数学の式では次の意味である&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
ax - t
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;先ほどの例では、予測値が $10$だった&lt;/li&gt;
&lt;li&gt;そして、正解値は $62.137$&lt;/li&gt;
&lt;li&gt;なので、次のように誤差が求まる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
10 - 62.137 = -52.137
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;誤差がマイナスであるということは、予測値が正解値よりも小さいという意味となる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="誤差の二乗を計算する"&gt;誤差の二乗を計算する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;そこで、誤差の二乗を計算する。&lt;/li&gt;
&lt;li&gt;これは、数学の式で書けば次の通り&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
(ax - t)^2
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最小二乗法では、この値を小さくすることが目的となる&lt;/li&gt;
&lt;li&gt;誤差をそのまま使わずに二乗する理由は、プラスの誤差とマイナスの誤差が打ち消し合わないようにするため&lt;/li&gt;
&lt;li&gt;また、大きな誤差ほどより大きく評価されるため、誤差を小さくする方向がわかりやすくなる&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="係数を更新する"&gt;係数を更新する&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;F列では、新しい係数 $a$ を計算している&lt;/li&gt;
&lt;li&gt;これは、次のような意味となる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
a_{\text{new}} = a - \eta \times e \\
a_{\text{new}} = a - \eta(ax - t)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a_new: 新しいa&lt;/li&gt;
&lt;li&gt;a: 現在のa&lt;/li&gt;
&lt;li&gt;$\eta$: 学習率&lt;/li&gt;
&lt;li&gt;e: 誤差&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ここで、誤差 $e$ は次のように定義する。&lt;/p&gt;
&lt;p&gt;$$
e = ax - t
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;そして、今回の学習率は $0.001$ である&lt;/li&gt;
&lt;li&gt;最初の更新では、現在の係数が $0.1$、誤差が $-52.137$ なので、次のようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
a_{\text{new}} = 0.1 - 0.001 \times (-52.137)
$$&lt;/p&gt;
&lt;p&gt;計算すると、次の値になる。&lt;/p&gt;
&lt;p&gt;$$
a_{\text{new}} = 0.152137
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;誤差がマイナスなので、係数 $a$ は増える&lt;/li&gt;
&lt;li&gt;これは自然な動きとなる&lt;/li&gt;
&lt;li&gt;なぜなら、最初の予測値は $10$ であり、正解値 $62.137$ よりも小さすぎるから&lt;/li&gt;
&lt;li&gt;予測値を大きくするには、係数 $a$ を大きくする必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="係数が正解に近づいていく"&gt;係数が正解に近づいていく&lt;/h2&gt;
&lt;p&gt;最初の係数は次の値である。&lt;/p&gt;
&lt;p&gt;$$
a = 0.1
$$&lt;/p&gt;
&lt;p&gt;一方、本当の係数は次の値である。&lt;/p&gt;
&lt;p&gt;$$
a = 0.62137
$$&lt;/p&gt;
&lt;p&gt;Excelでは、係数が次のように少しずつ更新されていく。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.152137
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.1990603
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.2412913
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.2792991
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.3135062
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;このように、係数 $a$ が少しずつ $0.62137$ に近づいていく。&lt;/li&gt;
&lt;li&gt;係数が正しい値に近づくことで、予測値も正解値に近づいていく。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="グラフからわかること"&gt;グラフからわかること&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/gosa.png"
width="1099"
height="464"
srcset="https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/gosa_hu_87ce8c4efc036988.png 480w, https://www.m1ke.org/p/excel%E3%81%A7%E5%AD%A6%E3%81%B6%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95/gosa_hu_53d75769165224d8.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="236"
data-flex-basis="568px"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;グラフでは、横軸に試行回数、縦軸に誤差の二乗を取っている&lt;/li&gt;
&lt;li&gt;最初は誤差が大きい&lt;/li&gt;
&lt;li&gt;これは、最初の係数 $a = 0.1$ では、100km を 10mile と予測してしまうから&lt;/li&gt;
&lt;li&gt;正解は 62.137mile であるため、最初の誤差はかなり大きい&lt;/li&gt;
&lt;li&gt;しかし、試行回数が増えるにつれて、係数 $a$ が更新される。その結果、予測値が正解値に近づき、誤差の二乗は急激に小さくなる&lt;/li&gt;
&lt;li&gt;この「誤差が小さくなっていく様子」が、最小二乗法の基本的なイメージである&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="機械学習との関係"&gt;機械学習との関係&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今回の例は非常にシンプル&lt;/li&gt;
&lt;li&gt;入力は1つだけ（$x=100$）&lt;/li&gt;
&lt;li&gt;正解も1つだけ（$t=62.137$）&lt;/li&gt;
&lt;li&gt;求める係数も1つだけ（$a$）&lt;/li&gt;
&lt;li&gt;しかし、考え方は機械学習の基本と同じ&lt;/li&gt;
&lt;li&gt;流れは次の通り:
&lt;ol&gt;
&lt;li&gt;適当な係数から始める&lt;/li&gt;
&lt;li&gt;その係数を使って予測する&lt;/li&gt;
&lt;li&gt;予測値と正解値のズレを計算する&lt;/li&gt;
&lt;li&gt;誤差が小さくなるように係数を更新する&lt;/li&gt;
&lt;li&gt;この処理を何度も繰り返す&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;今回の例では、まず適当な係数として $a = 0.1$ から始めている&lt;/li&gt;
&lt;li&gt;次に、その係数を使って予測する
$$
y = ax
$$&lt;/li&gt;
&lt;li&gt;そして、予測値と正解値のズレを計算する
$$
e = ax - t
$$&lt;/li&gt;
&lt;li&gt;最後に、誤差が小さくなるように係数を更新する
$$
a_{\text{new}} = a - \eta(ax - t)
$$&lt;/li&gt;
&lt;li&gt;この流れを何度も繰り返すことで、係数はだんだん正解に近づいていく&lt;/li&gt;
&lt;li&gt;つまり、今回のExcelは、非常に小さな機械学習モデルを表していると言える&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="厳密な最小二乗法との違い"&gt;厳密な最小二乗法との違い&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;注意事項として、係数の更新式をわかりやすくするために、今回は次の形にしている&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
a_{\text{new}} = a - \eta(ax - t)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;しかし、最小二乗法では、本来は誤差そのものではなく、誤差の二乗を小さくする&lt;/li&gt;
&lt;li&gt;誤差を $e$ とすると、次のようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
e = ax - t
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;そのため、誤差の二乗、つまり損失 $E$ は次のように定義できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
E = e^2 = (ax - t)^2
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;係数 $a$ をどの方向に更新すれば損失 $E$ が小さくなるかを知るために、$E$ を $a$ で微分する&lt;/li&gt;
&lt;li&gt;すると、次のようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\frac{dE}{da} = 2x(ax - t)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;したがって、厳密な勾配降下法では、更新式は次のようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
a_{\text{new}} = a - \eta \cdot 2x(ax - t)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;つまり、Excelで使った簡易版の更新式とは少し形が異なる&lt;/li&gt;
&lt;li&gt;また、損失関数を次のように置くことも多い&lt;/li&gt;
&lt;li&gt;なぜ $\frac{1}{2}$ を使うかというと、微分したときに $2$ が消えて、式が簡単になるからである&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
E = \frac{1}{2}(ax - t)^2
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;この場合、$E$ を $a$ で微分すると、次のようになる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\frac{dE}{da} = x(ax - t)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;したがって、更新式は次の形になる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
a_{\text{new}} = a - \eta x(ax - t)
$$&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;今回のExcelでは、$x = 100$ が固定である&lt;/li&gt;
&lt;li&gt;そのため、$x$ の影響を学習率側に含めた簡易版として、次の更新式を使っていると考えられる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
a_{\text{new}} = a - \eta(ax - t)
$$&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;今回は、Excelを使って、キロメートルをマイルに変換する係数を最小二乗法の考え方で求めた&lt;/li&gt;
&lt;li&gt;最初は、適当な係数 $a = 0.1$ から始めた&lt;/li&gt;
&lt;li&gt;そこから、次の流れを繰り返した
&lt;ol&gt;
&lt;li&gt;予測する&lt;/li&gt;
&lt;li&gt;誤差を計算する&lt;/li&gt;
&lt;li&gt;誤差の二乗を計算する&lt;/li&gt;
&lt;li&gt;係数を更新する&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;この繰り返しによって、係数 $a$ は少しずつ正解である $0.62137$ に近づいていった&lt;/li&gt;
&lt;li&gt;Excelを使うことで、最小二乗法の「誤差を小さくする」という考え方を視覚的に理解できる&lt;/li&gt;
&lt;li&gt;特に、グラフで誤差の二乗が急激に小さくなっていく様子を見ると、数式だけではわかりにくい学習のイメージがつかみやすい。&lt;/li&gt;
&lt;li&gt;キロからマイルへの変換という単純な例でも、最小二乗法や機械学習の基本的な考え方は十分に学ぶことができる&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>