質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

432閲覧

最小二乗法で一次関数をデータにフィッティングしたい

hanamur

総合スコア45

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2023/02/06 23:57

編集2023/02/07 09:59

最小二乗法で一次関数をデータにフィッティングしたいです。
具体的には下においてます、date.txtのデータです。
これをその一つ上のfitting.cppでフィッティングしたのですが、フィッティングできていません。
fitting.cppは
https://www.mk-mode.com/blog/2014/03/02/cpp-least-squares-method/
こちらのサイトを参考にさせていただいております。
実際に、他のデータで試してみるとフィッティングはうまくいきます。
しかし以下のdate.txtのデータではできません。
一次の係数として出力される値は約90です。
何が原因か、わかる方いらっしゃいましたらどうかよろしくお願いします。
[補足]date2.txtでも一次の係数として出力される値は約19で、うまくいきませんでした。

fitting.txt

1#include <iostream> 2#include <stdio.h> 3 4#define M 1 // 予測曲線の次数 5 6using namespace std; 7 8int main(){ 9 FILE* date; 10 errno_t error; 11 error = fopen_s(&date, "date.txt", "r"); 12 if (error != 0)exit(1); 13 double x[178],y[178]; 14 double a1,a2; 15 int i, j, k,N=0; 16 while (fscanf_s(date, "%lf %lf\n", &a1, &a2) != EOF) { 17 x[N]=a1; 18 y[N]=a2; 19 N++; 20 } 21 fclose(date) 22 23 double a[M + 1][M + 2] = {}, s[2 * M + 1] = {}, t[M + 1] = {}; 24 double p, d; 25 26 for (i = 0; i < N; i++) { 27 for (j = 0; j <= 2 * M; j++) 28 s[j] += pow(x[i], j); 29 for (j = 0; j <= M; j++) 30 t[j] += pow(x[i], j) * y[i]; 31 } 32 33 for (i = 0; i <= M; i++) { 34 for (j = 0; j <= M; j++) 35 a[i][j] = s[i + j]; 36 a[i][M + 1] = t[i]; 37 } 38 39 for (k = 0; k <= M; k++) { 40 p = a[k][k]; 41 for (j = k; j <= M + 1; j++) 42 a[k][j] /= p; 43 44 for (i = 0; i <= M; i++) { 45 if (i != k) { 46 d = a[i][k]; 47 for (j = k; j <= M + 1; j++) 48 a[i][j] -= d * a[k][j]; 49 } 50 } 51 } 52 53 for (k = 0; k <= M; k++)std::cout<< a[k][M + 1]<<std::endl; 54 return 0; 55}

date.txt

1-123.615 876.924 2-123.759 866.925 3-123.902 856.926 4-124.043 846.927 5-124.182 836.928 6-124.319 826.929 7-124.456 816.93 8-124.592 806.931 9-124.726 796.931 10-124.858 786.932 11-124.989 776.933 12-125.117 766.934 13-125.244 756.935 14-125.369 746.936 15-125.495 736.936 16-125.618 726.937 17-125.74 716.938 18-125.86 706.939 19-125.978 696.939 20-126.094 686.94 21-126.209 676.941 22-126.324 666.941 23-126.437 656.942 24-126.548 646.943 25-126.658 636.943 26-126.765 626.944 27-126.871 616.944 28-126.975 606.945 29-127.08 596.945 30-127.182 586.946 31-127.283 576.946 32-127.382 566.947 33-127.479 556.947 34-127.575 546.948 35-127.67 536.948 36-127.764 526.949 37-127.856 516.949 38-127.946 506.95 39-128.035 496.95 40-128.122 486.95 41-128.207 476.951 42-128.292 466.951 43-128.375 456.951 44-128.457 446.952 45-128.536 436.952 46-128.615 426.952 47-128.691 416.953 48-128.765 406.953 49-128.84 396.953 50-128.913 386.954 51-128.984 376.954 52-129.053 366.954 53-129.121 356.954 54-129.187 346.954 55-129.253 336.955 56-129.317 326.955 57-129.379 316.955 58-129.44 306.955 59-129.499 296.955 60-129.556 286.956 61-129.611 276.956 62-129.666 266.956 63-129.72 256.956 64-129.772 246.956 65-129.822 236.956 66-129.87 226.956 67-129.917 216.957 68-129.964 206.957 69-130.009 196.957 70-130.052 186.957 71-130.093 176.957 72-130.133 166.957 73-130.171 156.957 74-130.207 146.957 75-130.243 136.957 76-130.278 126.957 77-130.31 116.957 78-130.341 106.957 79-130.37 96.9574 80-130.398 86.9574 81-130.424 76.9575 82-130.449 66.9575 83-130.473 56.9575 84-130.496 46.9575 85-130.516 36.9576 86-130.535 26.9576 87-130.552 16.9576 88-130.569 6.95761 89-130.584 -3.04238 90-130.597 -13.0424 91-130.609 -23.0424 92-130.619 -33.0424 93-130.627 -43.0424 94-130.634 -53.0424 95-130.64 -63.0423 96-130.645 -73.0423 97-130.648 -83.0423 98-130.649 -93.0423 99-130.649 -103.042 100-130.647 -113.042 101-130.643 -123.042 102-130.637 -133.042 103-130.631 -143.042 104-130.624 -153.042 105-130.615 -163.042 106-130.604 -173.042 107-130.591 -183.042 108-130.577 -193.042 109-130.561 -203.042 110-130.544 -213.042 111-130.526 -223.042 112-130.507 -233.042 113-130.485 -243.042 114-130.462 -253.042 115-130.437 -263.042 116-130.411 -273.042 117-130.382 -283.042 118-130.354 -293.042 119-130.324 -303.042 120-130.292 -313.042 121-130.258 -323.042 122-130.223 -333.042 123-130.186 -343.042 124-130.147 -353.042 125-130.106 -363.042 126-130.064 -373.042 127-130.021 -383.041 128-129.977 -393.041 129-129.931 -403.041 130-129.884 -413.041 131-129.835 -423.041 132-129.783 -433.041 133-129.731 -443.041 134-129.676 -453.041 135-129.62 -463.04 136-129.562 -473.04 137-129.504 -483.04 138-129.444 -493.04 139-129.382 -503.04 140-129.319 -513.04 141-129.254 -523.039 142-129.187 -533.039 143-129.119 -543.039 144-129.048 -553.039 145-128.976 -563.038 146-128.902 -573.038 147-128.827 -583.038 148-128.751 -593.037 149-128.674 -603.037 150-128.595 -613.037 151-128.514 -623.037 152-128.432 -633.036 153-128.348 -643.036 154-128.262 -653.035 155-128.174 -663.035 156-128.084 -673.035 157-127.993 -683.034 158-127.9 -693.034 159-127.806 -703.033 160-127.709 -713.033 161-127.611 -723.032 162-127.511 -733.032 163-127.409 -743.031 164-127.306 -753.031 165-127.202 -763.03 166-127.097 -773.03 167-126.99 -783.029 168-126.881 -793.029 169-126.771 -803.028 170-126.659 -813.027 171-126.545 -823.027 172-126.429 -833.026 173-126.312 -843.025 174-126.193 -853.025 175-126.072 -863.024 176-125.949 -873.023 177-125.825 -883.022 178-125.699 -893.022

イメージ説明

date2.txt

1-124.491 876.8 2-124.626 866.801 3-124.758 856.801 4-124.889 846.802 5-125.019 836.803 6-125.146 826.804 7-125.273 816.805 8-125.399 806.806 9-125.523 796.806 10-125.645 786.807 11-125.766 776.808 12-125.884 766.809 13-126.001 756.809 14-126.116 746.81 15-126.232 736.811 16-126.345 726.811 17-126.457 716.812 18-126.567 706.812 19-126.675 696.813 20-126.781 686.814 21-126.886 676.814 22-126.991 666.815 23-127.094 656.815 24-127.195 646.816 25-127.294 636.816 26-127.392 626.817 27-127.488 616.817 28-127.582 606.818 29-127.677 596.818 30-127.769 586.818 31-127.86 576.819 32-127.949 566.819 33-128.036 556.82 34-128.122 546.82 35-128.207 536.82 36-128.291 526.821 37-128.373 516.821 38-128.453 506.821 39-128.532 496.822 40-128.609 486.822 41-128.684 476.822 42-128.759 466.823 43-128.832 456.823 44-128.904 446.823 45-128.973 436.823 46-129.041 426.824 47-129.108 416.824 48-129.172 406.824 49-129.237 396.824 50-129.3 386.824 51-129.361 376.825 52-129.42 366.825 53-129.478 356.825 54-129.534 346.825 55-129.589 336.825 56-129.644 326.825 57-129.696 316.826 58-129.747 306.826 59-129.795 296.826 60-129.843 286.826 61-129.888 276.826 62-129.933 266.826 63-129.977 256.826 64-130.019 246.826 65-130.059 236.826 66-130.097 226.826 67-130.134 216.826 68-130.171 206.827 69-130.206 196.827 70-130.239 186.827 71-130.27 176.827 72-130.3 166.827 73-130.328 156.827 74-130.354 146.827 75-130.38 136.827 76-130.405 126.827 77-130.427 116.827 78-130.448 106.827 79-130.467 96.827 80-130.485 86.827 81-130.501 76.827 82-130.516 66.827 83-130.53 56.827 84-130.542 46.827 85-130.553 36.827 86-130.562 26.827 87-130.569 16.827 88-130.576 6.82704 89-130.581 -3.17296 90-130.584 -13.173 91-130.586 -23.173 92-130.586 -33.173 93-130.584 -43.173 94-130.581 -53.173 95-130.577 -63.173 96-130.572 -73.173 97-130.565 -83.173 98-130.556 -93.1729 99-130.546 -103.173 100-130.534 -113.173 101-130.52 -123.173 102-130.504 -133.173 103-130.488 -143.173 104-130.471 -153.173 105-130.452 -163.173 106-130.431 -173.173 107-130.408 -183.173 108-130.384 -193.173 109-130.357 -203.173 110-130.331 -213.173 111-130.303 -223.173 112-130.274 -233.173 113-130.242 -243.173 114-130.209 -253.173 115-130.174 -263.172 116-130.138 -273.172 117-130.099 -283.172 118-130.061 -293.172 119-130.021 -303.172 120-129.979 -313.172 121-129.935 -323.172 122-129.89 -333.172 123-129.843 -343.172 124-129.794 -353.172 125-129.743 -363.172 126-129.691 -373.171 127-129.638 -383.171 128-129.584 -393.171 129-129.528 -403.171 130-129.471 -413.171 131-129.411 -423.171 132-129.35 -433.17 133-129.288 -443.17 134-129.223 -453.17 135-129.157 -463.17 136-129.089 -473.17 137-129.021 -483.169 138-128.951 -493.169 139-128.879 -503.169 140-128.806 -513.169 141-128.731 -523.168 142-128.654 -533.168 143-128.575 -543.168 144-128.495 -553.167 145-128.413 -563.167 146-128.329 -573.167 147-128.244 -583.166 148-128.158 -593.166 149-128.071 -603.166 150-127.982 -613.165 151-127.891 -623.165 152-127.799 -633.164 153-127.705 -643.164 154-127.609 -653.163 155-127.511 -663.163 156-127.411 -673.162 157-127.31 -683.162 158-127.207 -693.161 159-127.102 -703.161 160-126.996 -713.16 161-126.888 -723.16 162-126.778 -733.159 163-126.666 -743.158 164-126.553 -753.158 165-126.439 -763.157 166-126.324 -773.157 167-126.207 -783.156 168-126.088 -793.155 169-125.968 -803.154 170-125.846 -813.154 171-125.722 -823.153 172-125.596 -833.152 173-125.469 -843.151 174-125.34 -853.15 175-125.209 -863.15 176-125.076 -873.149 177-124.942 -883.148 178-124.806 -893.147 179

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

いや、よく考えれば最小二乗法というのはこういうものでした。
フィッティング関数が垂直になると誤差二乗平均平方根も発散してしまうため、垂直に近いデータに対してはフィッティングできませんでした。
見ていただいた方ありがとうございます。

投稿2023/02/07 17:16

hanamur

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2023/02/07 22:13

x, y を入れ替え、 x = ay + b でfitさせ、y = x/a - b/a で元に戻すてのはどうだろう...
fana

2023/02/08 01:09

> フィッティング関数が垂直になると… っていうのが問題になる場合, 普通は y=ax+b という関数(残差を「y方向」で考えているもの)を使わずに, ax+by+c=0 っていう形の関数を使う(「直線からの距離」を残差として評価する). ……っていうような話が,直線フィッティングの解説みたいな箇所には大抵あると思う.
guest

0

正しくフィッティングできていれば一次の係数は130前後になるはずです。しかし出力される値は約90です。

「130前後になるはず」というのはどんな話なのでしょう?
そのデータを Excel に食わせて線形近似させてみても「約90」になります.

というか, データの分布がどう見ても一次関数的ではない (横になった放物線みたいな分布である)ように見えるので,何か根本的にやっていることが変なのでは?
(単純にデータファイルを取り違えているとかそういう?)

投稿2023/02/07 06:17

fana

総合スコア11656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2023/02/07 06:19

何はともあれ,まずは(こういう場所に質問とかするよりも前に)データをプロットしてみる等して,何が起こっているのかを確認してみるべきでしょう.
hanamur

2023/02/07 10:15 編集

回答ありがとうございます。 約130になるはずというのは誤りでした。もっと大きな値になるはずです。 一次関数にフィッティングしようとしています。 date.txtとフィッティング関数ををgnuplotでプロットしたものと、追加のdate2.txtを同様に処理したものを捕捉で追加させてもらいました。date2.txtは一次の係数が約19になっています。 明らかにフィッテイングできてないように見えます。 何が原因でしょうか。どうかお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問