変数より式の本数が多い場合の連立方程式って?

ちょっと算数のめも。

2x1 + 3x2 = 10
x1 + 6x2 = 20

簡単である。だが、この場合はどうだろうか?

2x1 + 3x2 = 10
x1 + 6x2 = 20
3x1 + 4x2 = 30

変数が2つしかないのに式が3つとは一体。。算数やってたころはあまり意識しなかったがコレ、現実世界では普通に直面する。確かに、変数の数より観測データの方が多いなんて当たり前だよね。


調べたところこのような場合、厳密解はないから近似曲線を求めてはいめでたしとすることがある。最小二乗法なる手法があるのでpythonで係数ベクトルを求めてみた。

scipyを使うと1行で終わります。マジpython神。コメントアウト部分は行列計算を自分でやってみたときのログ。結果は同じものが得られた。

誤差分析?知らんがな

#encoding=utf-8

import numpy as np
import pandas
from scipy.linalg import lstsq

path = 'data.csv'

frame = pandas.io.parsers.read_table(path)
np_data = frame.as_matrix()

npm_data = np.matrix(np_data.T[2:]).T
npm_y = np.matrix(np_data.T[0]).T

'''
npm_solution = (npm_data.T * npm_data).I * npm_data.T * npm_y
print npm_solution, np.shape(npm_solution)
print npm_solution.T
'''

print 'scipy solution'
print lstsq(np.array(npm_data), np.array(npm_y))[0].T