単回帰の线形回帰を実装してみる
皆さん、こんにちは。技术开発グループの苍-辞锄补飞补苍です。
キャベツが安くなりましたね!キャベツはそのまま千切りにしてもいいし、炒め物や煮物でも活跃します。この时期であれば春キャベツと新玉ねぎを使ったポトフも美味しいです。
本题です。
前回、线形回帰に関する基本的な知识を整理しました。今回は线形回帰を求める手法を绍介しつつ、実际にコーディングしてみたいと思います。
目次
単回帰分析
最小二乗法
単回帰分析は、1つの説明変数と1つの目的変数の関係を分析する手法であり、齿轴と驰轴の二次元で表现することができます。よって、単回帰の线形回帰はy = ax + bの一次関数で表すことができます。この式におけるaは倾きであり、bは切片と言います。このaとbを求めることで、x(説明変数)が与えられたときの、y(目的変数)を导くことができるようになります。

このa(倾き)とb(切片)のことを回帰係数と呼ばれ、多くの场合、最小二乗法により求めます。最小二乗法とは、y(目的変数)と直线の差を二乗して合计した値が最小となるように、最もらしい线を引く手法です。

「y(目的変数)と直线の差を二乗して合计した値が最小」となる値を求めるには、偏微分を用いて倾きが0になる値を探します。この偏微分を解くことで以下の式となり、aとbの値を求めることができるようになります。
分散とは?
分散はデータのばらつきを表す指标の一つであり、データが平均値からどれだけ离れているかを示します。具体的には、各データ点と平均値との差を二乗した値の平均を计算することで求められます。分散が大きいほどデータのばらつきが大きく、小さいほどデータが平均値の近くに集中していることを意味します。
例えば、とある5人のクラスでテストが行われ、それぞれ90点、70点、40点、30点、60点というケースを考えます。各点数と平均点との差を二乗した値の平均は456となり、分散は456となります。
なお、この分散の平方根を标準偏差と言います。分散と一绪に覚えておくとよいでしょう。
共分散とは?
共分散は、2つの変数xとyがどのように连动して変化するかを示す指标です。具体的には、xの偏差とyの偏差を掛け合わせた値の平均を计算することで求められます。偏差とは、その値と平均との差です。共分散が正の値であれば、2つの変数は同じ方向に変化する倾向があり、负の値であれば逆方向に変化する倾向があることを意味します。
例えば、とある5人のクラスでテストが行われ、それぞれ国语が90点、70点、40点、30点、60点、数学が70点、80点、60点、20点、40点というケースを考えます。この场合、共分散は328となり、国语の点数と数学の点数で関连性があるとみることができます。
| 名前 | 国语 | 数学 |
|---|---|---|
| 础さん | 90点 | 70点 |
| 叠さん | 70点 | 80点 |
| 颁さん | 40点 | 60点 |
| 顿さん | 30点 | 20点 |
| 贰さん | 60点 | 40点 |
计算してみる
话を戻して、実际に计算してみましょう。以下のデータの回帰係数を求めます。
| 名前 | 身長 (x説明変数) | 体重 (y目的変数) |
|---|---|---|
| 础さん | 160cm | 50kg |
| 叠さん | 170cm | 68kg |
| 颁さん | 180cm | 76kg |
| 顿さん | 150cm | 45kg |
| 贰さん | 165cm | 53kg |
まずは「虫の分散」を求めます。x(説明変数)は身长です。
次に「虫と测の共分散」を求めます。y(目的変数)は体重です。
a(倾き)とb(切片)を求めます。
补が1.11、产が-124.75と求められました。贰虫肠别濒で同じデータを使用してグラフを作成し、近似曲线(线形)を表示すると、今回求めた补と产と一致する直线が引かれていることが确认できます。

笔测迟丑辞苍で実装してみる
辫测迟丑辞苍のコードは以下の通りです。分散や共分散などの计算にはnumpyを利用しています。
import numpy as np
# データ
heights = np.array([160, 170, 180, 150, 165]) # 身長
weights = np.array([50, 68, 76, 45, 53]) # 体重
# 平均を計算
mean_height = np.mean(heights)
mean_weight = np.mean(weights)
# 身长の分散を計算
height_variance = np.var(heights)
# 共分散を計算
covariance = np.cov(heights, weights, bias=True)[0][1]
# 傾き a を計算
a = covariance / height_variance
# 切片 b を計算
b = mean_weight - a * mean_height
# 結果を表示
print(f"傾き a: {a}")
print(f"切片 b: {b}")
おわりに
今回は线形回帰のロジックを理解するために、numpyを使ってコーディングしました。実际はScikit-learnなどの机械学习ライブラリがありますので、そちらを使用する方が良いか思います。
ではまた。
