2 * Introduction to lsquares::
3 * Functions and Variables for lsquares::
6 @c -----------------------------------------------------------------------------
7 @node Introduction to lsquares, Functions and Variables for lsquares, lsquares, lsquares
8 @section Introduction to lsquares
9 @c -----------------------------------------------------------------------------
13 最小二乗法を実装するための関数のコレクションです。
16 @category{Statistical estimation} @category{Share packages} @category{Package lsquares}
20 @c -----------------------------------------------------------------------------
21 @node Functions and Variables for lsquares, , Introduction to lsquares, lsquares
22 @section Functions and Variables for lsquares
23 @c -----------------------------------------------------------------------------
25 @deffn {関数} lsquares_estimates (@var{D}, @var{x}, @var{e}, @var{a})
26 @deffnx {関数} lsquares_estimates (@var{D}, @var{x}, @var{e}, @var{a}, initial = @var{L}, tol = @var{t})
29 変数@var{x}と@var{a}の方程式@var{e}を
32 @code{lsquares_estimates}は最初に厳密な解を探し、
36 形式 @code{[a = ..., b = ..., c = ...]}の等式のリストのリストです。
40 データ @var{D}は行列でなければいけません。
41 行それぞれは(文脈によって「レコード」とか「ケース」とか呼ばれる)1つのデータで、
43 すべてのデータに関するある変数の値を含みます。
44 変数のリスト @var{x}は @var{D}の列それぞれの名前を与えます。
49 方程式 @var{e}は変数 @var{x}と @var{a}に関する式か等式です;
51 @code{@var{e} = 0}と同様に扱われます。
53 @code{lsquares_estimates}の付加引数は
56 数値方法で見積もりを見つけるためにコールされる関数 @code{lbfgs}へそのまま渡されます。
58 もしある厳密解が(@code{solve}を介して)見つけることができるなら、
59 データ @var{D}は非数値を含むかもしれません。
61 @var{D}の要素それぞれは数値でなければいけません。
63 数リテラル(整数、有理数、通常の浮動小数点、多倍長浮動小数点)はもちろん、
64 @code{%pi}や@code{%e}のような数値定数を含みます。
65 数値計算は通常の浮動小数点算出で実行されます。
66 他の種類の数値は計算のため、すべて通常の浮動小数点に変換されます。
68 @code{load(lsquares)}はこの関数をロードします。
70 @code{lsquares_estimates_exact},
71 @code{lsquares_estimates_approximate},@*
73 @code{lsquares_residuals},
74 @code{lsquares_residual_mse}も参照してください。
83 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
84 @c lsquares_estimates (
85 @c M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
88 (%i1) load (lsquares)$
90 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
106 (%i3) lsquares_estimates (
107 M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
109 (%o3) [[A = - --, B = - --, C = -----, D = - ---]]
114 だから @code{lsquares_estimates}は数値近似に頼ります。
118 @c M : matrix ([1, 1], [2, 7/4], [3, 11/4], [4, 13/4]);
119 @c lsquares_estimates (
120 @c M, [x,y], y=a*x^b+c, [a,b,c], initial=[3,3,3], iprint=[-1,0]);
123 (%i1) load (lsquares)$
124 (%i2) M : matrix ([1, 1], [2, 7/4], [3, 11/4], [4, 13/4]);
138 (%i3) lsquares_estimates (
139 M, [x,y], y=a*x^b+c, [a,b,c], initial=[3,3,3], iprint=[-1,0]);
140 (%o3) [[a = 1.387365874920637, b = .7110956639593767,
141 c = - .4142705622439105]]
145 @category{Package lsquares} @category{Numerical methods}
150 @deffn {関数} lsquares_estimates_exact (@var{MSE}, @var{a})
152 方程式系を構成し、@code{solve}を介して記号的にそれらを解くことを試みることで、
153 平均二乗誤差 @var{MSE}を最小化する
154 パラメータ @var{a}を見積もります。
156 @code{lsquares_mse}が返すような
160 形式 @code{[a = ..., b = ..., c = ...]}の等式のリストのリストです。
161 戻り値は、0個か1個、2以上の要素を含むかもしれません。
163 それぞれは個別の、平均二乗誤差の等価最小を表します。
165 @code{lsquares_estimates},
166 @code{lsquares_estimates_approximate},
167 @code{lsquares_mse},@*
168 @code{lsquares_residuals},
169 @code{lsquares_residual_mse}も参照してください。
176 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
177 @c mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
178 @c lsquares_estimates_exact (mse, [A, B, C, D]);
181 (%i1) load (lsquares)$
183 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
197 (%i3) mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
201 > ((D + M ) - C - M B - M A)
205 (%o3) ---------------------------------------------
207 (%i4) lsquares_estimates_exact (mse, [A, B, C, D]);
209 (%o4) [[A = - --, B = - --, C = -----, D = - ---]]
214 @category{Package lsquares}
219 @deffn {関数} lsquares_estimates_approximate (@var{MSE}, @var{a}, initial = @var{L}, tol = @var{t})
221 平均二乗誤差 @var{MSE}を最小化する
223 数値最小化関数 @code{lbfgs}を介して
226 @code{lsquares_mse}が返すようなパラメータ @var{a}の式です。
229 @code{lsquares_estimates_approximate}が返す解は
230 平均二乗誤差の(たぶん大域ですが)局所最小値です。
231 @code{lsquares_estimates_exact}との一貫性のため、
233 要素1つ、すなわち、形式 @code{[a = ..., b = ..., c = ...]}の等式のリスト
236 @code{lsquares_estimates_approximate}の付加引数は
238 数値方法で見積もりを見つけるためにコールされる関数 @code{lbfgs}へそのまま渡されます。
241 @var{MSE}はは数に評価されなければいけません。
243 This requires that the data from which
245 @code{%pi}や@code{%e}、
246 数リテラル(整数、有理数、通常の浮動小数点、多倍長浮動小数点)
248 数値計算は通常の浮動小数点算出で実行されます。
249 他の種類の数値は計算のため、すべて通常の浮動小数点に変換されます。
251 @code{load(lsquares)}はこの関数をロードします。
253 @code{lsquares_estimates},
254 @code{lsquares_estimates_exact},
256 @code{lsquares_residuals},
257 @code{lsquares_residual_mse}も参照してください。
264 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
265 @c mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
266 @c lsquares_estimates_approximate (
267 @c mse, [A, B, C, D], iprint = [-1, 0]);
270 (%i1) load (lsquares)$
272 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
286 (%i3) mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
290 > ((D + M ) - C - M B - M A)
294 (%o3) ---------------------------------------------
296 (%i4) lsquares_estimates_approximate (
297 mse, [A, B, C, D], iprint = [-1, 0]);
298 (%o4) [[A = - 3.67850494740174, B = - 1.683070351177813,
299 C = 10.63469950148635, D = - 3.340357993175206]]
303 @category{Package lsquares} @category{Numerical methods}
308 @deffn {関数} lsquares_mse (@var{D}, @var{x}, @var{e})
311 変数 @var{x}の 方程式@var{e}に関する
312 データ @var{D}の和の式を返します。
317 $${1 \over n} \, \sum_{i=1}^n \left[{\rm lhs}\left(e_i\right) - {\rm rhs}\left(e_i\right)\right]^2,$$
324 - > (lhs(e ) - rhs(e ))
333 @code{i}番目のデータ @code{@var{D}[i]}から値を割り当てられた
334 @var{x}の中の変数に対して評価された方程式 @var{e}です。
336 @code{load(lsquares)}はこの関数をロードします。
343 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
344 @c mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
349 (%i1) load (lsquares)$
351 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
367 (%i3) mse : lsquares_mse (M, [z, x, y], (z + D)^2 = A*x + B*y + C);
371 > ((D + M ) - C - M B - M A)
375 (%o3) ---------------------------------------------
383 4 > (D + M ) ((D + M ) - C - M B - M A)
384 / i, 1 i, 1 i, 3 i, 2
387 (%o4) ----------------------------------------------------------
394 (%o5) (((D + 3) - C - 2 B - 2 A) + ((D + -) - C - B - 2 A)
397 + ((D + 2) - C - B - 2 A) + ((D + -) - C - 2 B - A)
400 + ((D + 1) - C - B - A) )/5
405 @category{Package lsquares}
410 @deffn {関数} lsquares_residuals (@var{D}, @var{x}, @var{e}, @var{a})
412 指定されたパラメータ @var{a}とデータ @var{D}での
413 方程式 @var{e}に関する残差を返します。
416 @var{D}は行列で、 @var{x}は変数のリスト、
419 @code{@var{e} = 0}であるかのように扱われます。
421 @var{x}を除いた@var{e}の任意の自由変数に値を指定する
427 $${\rm lhs}\left(e_i\right) - {\rm rhs}\left(e_i\right),$$
438 @var{a}から任意の残りの自由変数を割り当てて、
439 @code{i}番目のデータ @code{@var{D}[i]}から値を割り当てられた
440 @var{x}の中の変数に対して評価された方程式 @var{e}です。
442 @code{load(lsquares)}はこの関数をロードします。
449 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
450 @c a : lsquares_estimates (
451 @c M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
452 @c lsquares_residuals (
453 @c M, [z,x,y], (z+D)^2 = A*x+B*y+C, first(a));
456 (%i1) load (lsquares)$
458 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
472 (%i3) a : lsquares_estimates (
473 M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
475 (%o3) [[A = - --, B = - --, C = -----, D = - ---]]
477 (%i4) lsquares_residuals (
478 M, [z,x,y], (z+D)^2 = A*x+B*y+C, first(a));
480 (%o4) [--, - --, - --, --, --]
485 @category{Package lsquares}
490 @deffn {関数} lsquares_residual_mse (@var{D}, @var{x}, @var{e}, @var{a})
492 指定されたパラメータ @var{a}とデータ @var{D}での
493 方程式 @var{e}に関する残差平均二乗誤差を返します。
498 $${1 \over n} \, \sum_{i=1}^n \left[{\rm lhs}\left(e_i\right) - {\rm rhs}\left(e_i\right)\right]^2,$$
505 - > (lhs(e ) - rhs(e ))
514 @var{a}から任意の残りの自由変数を割り当てて、
515 @code{i}番目のデータ @code{@var{D}[i]}から値を割り当てられた
516 @var{x}の中の変数に対して評価された方程式 @var{e}です。
518 @code{load(lsquares)}はこの関数をロードします。
525 @c [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
526 @c a : lsquares_estimates (
527 @c M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
528 @c lsquares_residual_mse (
529 @c M, [z,x,y], (z + D)^2 = A*x + B*y + C, first (a));
532 (%i1) load (lsquares)$
534 [1,1,1], [3/2,1,2], [9/4,2,1], [3,2,2], [2,2,1]);
548 (%i3) a : lsquares_estimates (
549 M, [z,x,y], (z+D)^2 = A*x+B*y+C, [A,B,C,D]);
552 (%o3) [[A = - --, B = - --, C = -----, D = - ---]]
554 (%i4) lsquares_residual_mse (
555 M, [z,x,y], (z + D)^2 = A*x + B*y + C, first (a));
562 @category{Package lsquares}
567 @deffn {関数} plsquares (@var{Mat},@var{VarList},@var{depvars})
568 @deffnx {関数} plsquares (@var{Mat},@var{VarList},@var{depvars},@var{maxexpon})
569 @deffnx {関数} plsquares (@var{Mat},@var{VarList},@var{depvars},@var{maxexpon},@var{maxdegree})
570 「最小二乗」法によるデータ表の多変数多項式調整。
571 @var{Mat}はデータを含む行列であり、
572 @var{VarList}は変数名(Mat列それぞれの名前ですが、Mat列を無視する際には変数名の代わりに"-")のリストであり、
573 @var{depvars}は従属変数の名前か、
574 従属変数の1つ以上の名前(その名前@var{VarList}の中になければいけません)のリストであり、
575 @var{maxexpon}はオプションの、独立変数それぞれの最大指数(デフォルト1)であり、
576 @var{maxdegree}はオプションの最大多項式次数(デフォルトで@var{maxexpon})です;
577 それぞれの項の指数の和は@var{maxdegree}以下でなければいけないことに注意してください。
578 もし @code{maxdgree = 0}なら制限は適用されません。
580 もし @var{depvars}が(リストではなく)従属変数の名前なら、
581 @code{plsquares}は調整された多項式を返します。
582 もし @var{depvars}が1つ以上の従属変数のリストなら、
583 @code{plsquares}は調整された多項式のリストを返します。
586 それは0 (無相関)から1 (厳密相関)までの範囲です。
588 グローバル変数 @var{DETCOEF}(もし @var{depvars}がリストならリスト)にも保管されます。
593 (%i1) load("plsquares")$
595 (%i2) plsquares(matrix([1,2,0],[3,5,4],[4,7,9],[5,8,10]),
597 Determination Coefficient for z = .9897039897039897
599 (%o2) z = ---------------
605 (%i3) plsquares(matrix([1,2,0],[3,5,4],[4,7,9],[5,8,10]),
607 Determination Coefficient for z = 1.0
608 x y + 23 y - 29 x - 19
609 (%o3) z = ----------------------
616 (%i4) plsquares(matrix([3,0],[4,2],[5,5],[6,9],[7,14],[8,20]),
617 [N,diagonals],diagonals,5);
618 Determination Coefficient for diagonals = 1.0
621 (%o4) diagonals = --------
623 (%i5) ev(%, N=9); /* Testing for a 9 sides polygon */
627 何通りの方法でn掛けnのチェス盤に2つのクィーンを取られないように置けますか?
629 (%i6) plsquares(matrix([0,0],[1,0],[2,0],[3,8],[4,44]),
630 [n,positions],[positions],4);
631 Determination Coefficient for [positions] = [1.0]
634 3 n - 10 n + 9 n - 2 n
635 (%o6) [positions = -------------------------]
638 (%i7) ev(%[1], n=8); /* Testing for a (8 x 8) chessboard */
639 (%o7) positions = 1288
644 (%i8) mtrx:matrix([0,0,0,0,0,1,1,1],[0,1,0,1,1,1,0,0],
645 [1,0,0,1,1,1,0,0],[1,1,1,1,0,0,0,1])$
646 (%i8) plsquares(mtrx,[a,b,_And,_Or,_Xor,_Nand,_Nor,_Nxor],
647 [_And,_Or,_Xor,_Nand,_Nor,_Nxor],1,0);
648 Determination Coefficient for
649 [_And, _Or, _Xor, _Nand, _Nor, _Nxor] =
650 [1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
651 (%o2) [_And = a b, _Or = - a b + b + a,
652 _Xor = - 2 a b + b + a, _Nand = 1 - a b,
653 _Nor = a b - b - a + 1, _Nxor = 2 a b - b - a + 1]
657 最初に @code{load("lsquares")}を書いてください。
660 @category{Package lsquares} @category{Numerical methods}