📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の3版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
最小二乗法は、データ点と予測モデルとの誤差を最小化する手法として、統計学や機械学習で使用されている手法である。<br>
<br>
これは、実測値と予測値の差 (残差) の2乗和を最小にすることである。<br>
2乗を用いる理由は、正と負の誤差を同等に扱えること、および、数学的な扱いが容易になるためである。<br>
<br>
線形回帰直線は、次式で表現される。<br>
予測モデル:
<math>y = ax + b</math>
yは目的変数、xは説明変数、aは傾き、bは切片である。
<br>
残差平方和 (RSS : Residual Sum of Squares) は、次式のように表される。<br>
<math>RSS = \sum_{i=1}^n (y_{i} - (a x_{i} + b))^{2}</math>
または
<math>RSS = \sum_{i=1}^n (y_{i} - \hat y_{i})^{2} \quad \because \hat y_{i} = a x_{i} + b</math>
<math>(y_{i}, x_{i})</math> は実測データの点である。
<br>
真値との誤差の2乗 <math>RSS^{2} = (y_{i} - \hat{y_{i}})^{2}</math> の総和が最小になれば、直線モデル(回帰直線)が最良になる。<br>
この残差平方和を最小化するために、aとbに関する偏微分を0とおく。<br>
<br>
<math>\dfrac{\partial RSS}{\partial a} = 2 \sum_{i=1}^n (y_{i} - (a x_{i} + b)) \cdot (-x_{i}) = 0</math><br>
<br>
<math>\dfrac{\partial RSS}{\partial b} = 2 \sum_{i=1}^n (y_{i} - (a x_{i} + b)) \cdot (-1)= 0</math><br>
<br>
これらの方程式を解くことにより、最適なaとbを求めることができる。<br>
ここで、nはデータ点の数である。<br>
<br>
詳細な導出過程は、[[第4回 - 2変数の回帰分析]]のページを参照すること。<br>
<br>
<math>
\begin{align}
a &= \dfrac{\dfrac{1}{n} \sum_{i=1}^n {(x_i - \bar{x})(y_i - \bar{y})}}{\dfrac{1}{n} \sum_{i=1}^n {(x_i - \bar{x})^{2}}} \\
  &= \dfrac{\sum_{i=1}^n {(x_i - \bar{x})(y_i - \bar{y})}}{\sum_{i=1}^n {(x_i - \bar{x})^{2}}} \\
  &= \dfrac{C_{xy}}{\sigma_{x}^{2}} \\
  &= \dfrac{\mbox{  x  と  y  の  共  分  散  }}{\mbox{  x  の  母  分  散  }}
\end{align}
</math><br>
<br>
<math>
\begin{align}
b &= \dfrac{\sum_{i=1}^n {y_i} - a \sum_{i=1}^n {x_i}}{n} \\
  &= \bar{y} - a \bar{x}
\end{align}
</math><br>
<br>
最小二乗法は単純な線形回帰だけでなく、多変量解析や非線形回帰等の複雑なモデルにも拡張することが可能である。<br>
例えば、多項式回帰では、予測モデルを <math>y = ax^{2} + bx + c</math> のように設定して、同様の原理で係数を求めることができる。<br>
<br>
また、正規方程式を行列形式で表現することにより、効率的に計算することも可能である。<br>
特に大規模なデータセットを扱う場合、数値計算ライブラリを使用して効率的に解を求めることができる。<br>
<br><br>
<br><br>


192行目: 244行目:
<br>
<br>


===== CMakeLists.txtを使用する場合 =====
<syntaxhighlight lang="cmake">
# Pkg-configを使用する場合
find_package(Eigen3 <Eigenライブラリのバージョン  例: 3.3> REQUIRED NO_MODULE)
# Pkg-configを使用しない場合 (Eigenライブラリのインクルードパスを直接指定)
# 例えば、Eigenライブラリを手動でダウンロードした場合は、EIGEN3_INCLUDE_DIRにパスを設定する
# set(EIGEN3_INCLUDE_DIR "<Eigenのインクルードディレクトリ>")
# include_directories(${EIGEN3_INCLUDE_DIR})
# Eigenライブラリとのリンク (find_packageを使用する場合)
# add_executableコマンドの後
target_link_libraries(${PROJECT_NAME} PRIVATE
    Eigen3::Eigen
)
# ビルド設定
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    # デバッグビルド設定
    add_definitions(-DEIGEN_INITIALIZE_MATRICES_BY_NAN)
    add_definitions(-DEIGEN_DEBUG)
endif()
# 最適化オプション
if(CMAKE_BUILD_TYPE STREQUAL "Release")
    add_definitions(-DNDEBUG)
    if(CMAKE_COMPILER_IS_GNUCXX)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -march=native")
    endif()
endif()
# OpenMPサポートを追加 (オプション)
# 行列演算の並列化に使用可能
# find_package(OpenMP)
# if(OpenMP_CXX_FOUND)
#    target_link_libraries(my_program OpenMP::OpenMP_CXX)
# endif()
</syntaxhighlight>
<br>
===== Eigenライブラリの使用例 =====
===== Eigenライブラリの使用例 =====
行列計算ライブラリであるEigenライブラリを使用することもできる。<br>
行列計算ライブラリであるEigenライブラリを使用することもできる。<br>