コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
最近の更新
未作成ページ
おまかせ表示
ヘルプ
MonoBook
検索
検索
ログイン
個人用ツール
ログイン
ログアウトした編集者のページ
もっと詳しく
投稿記録
トーク
「
回帰分析
」を編集中
ページ
議論
日本語
閲覧
編集
ソースを編集
履歴表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
編集
ソースを編集
履歴表示
全般
リンク元
関連ページの更新状況
特別ページ
ページ情報
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
'''回帰分析'''とは、データの関係をなるべくずれないように式で表すための手法である。 ==実装例== (x,y)の関係をy=a*x+bという式で表すとき、全ての点について(a*x+b-y)の二乗を求め、その和が最小になるようなa,bを求める。<br /> この実装では、x,yの組を1行に一個ずつコンマ区切りで入力する。 <source lang="c"> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { /*入力用*/ char inputbuf[100000]; char* comma; char* comma2; /*入力チェック用*/ char* endptr; /*統計用*/ int datanum=0; int ignorenum=0; /*計算用*/ double x,y; double abkeisuu; double ateisuu; double b2keisuu; double bkeisuu; double teisuu; double b; double a; double keisuu[6]={0,0,0,0,0,0}; /* 0:a^2 1:b^2 2:ab 3:a 4:b 5:定数 */ /*データ入力*/ while(fgets(inputbuf,sizeof(inputbuf),stdin)) { /*入力データの解析*/ /*改行を消す*/ comma=strchr(inputbuf,'\n'); if(comma)*comma=0; /*一つ目のコンマ*/ comma=strchr(inputbuf,','); if(comma==NULL) { /*コンマが一つもない*/ ignorenum++; continue; } *comma=0; /*二つ目のコンマ*/ comma2=strchr(comma+1,','); if(comma2)*comma2=0;/*いらないデータは消す*/ /*変換とデータチェック*/ x=strtod(inputbuf,&endptr); if(*endptr!=0) { ignorenum++; continue; } y=strtod(comma+1,&endptr); if(*endptr!=0) { ignorenum++; continue; } /*係数を加える*/ keisuu[5]+=y*y; keisuu[0]+=x*x; keisuu[1]+=1; keisuu[3]-=2.0*x*y; keisuu[2]+=2.0*x; keisuu[4]-=2.0*y; /*データ数を増やす*/ datanum++; } /*計算*/ /* a^2+b^2+ab+a+b+1 a^2+(b+1)a+b^2+b+1→2a+(b+1)=0→2a=-b-1→a=-b/2-1/2 */ if(keisuu[0]==0) { puts("エラー:第一次0除算"); return 1; } abkeisuu=-keisuu[2]/2.0/keisuu[0]; ateisuu=-keisuu[3]/2.0/keisuu[0]; b2keisuu=keisuu[0]*abkeisuu*abkeisuu+keisuu[1]+keisuu[2]*abkeisuu; bkeisuu=keisuu[0]*2.0*abkeisuu*ateisuu+keisuu[2]*ateisuu+keisuu[3]*abkeisuu+keisuu[4]; teisuu=keisuu[0]*ateisuu*ateisuu+keisuu[3]*ateisuu+keisuu[5]; if(b2keisuu==0) { puts("エラー:第二次0除算"); return 1; } b=-bkeisuu/2.0/b2keisuu; a=abkeisuu*b+ateisuu; /*結果の出力*/ printf("総行数:%d\n",datanum+ignorenum); printf("無視した行数:%d\n",ignorenum); printf("データの行数:%d\n",datanum); if(b>=0) { printf("y=%1.15gx+%1.15g\n",a,b); } else { printf("y=%1.15gx%1.15g\n",a,b); } return 0; } </source> 入力例(無効なデータは無視される) <pre>時刻[s],速さ[m/s] 0.05,0.70 0.15,1.60 0.25,2.57 0.35,3.53 0.45,4.51</pre> 出力例 <pre>総行数:6 無視した行数:1 データの行数:5 y=9.55000000000001x+0.194499999999998</pre> ==関連項目== * [[最小自乗法]] * [[重回帰分析]]
編集内容の要約:
MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MonoBook:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の確認用の質問に回答してください (
詳細
):
1たす1は?(全角で入力してください)
キャンセル
編集の仕方
(新しいウィンドウで開きます)
本文の横幅制限を有効化/無効化