38

Web ブラウザーで Javascript で最小二乗法を実行したいと考えています。

現在、ユーザーは HTML テキスト入力を使用してデータ ポイント情報を入力し、そのデータを jQuery で取得してFlotでグラフ化しています。

ユーザーがデータポイントを入力した後、「最適な線」を提示したいと思います。線形、多項式、指数、および対数の方程式を計算し、最も高いR^2値を持つものを選択すると想像します。

ただし、これを行うのに役立つライブラリが見つからないようです。私はjStatに出くわしましたが、ドキュメントが完全に欠落しており (私が見つけることができる限り)、ソースコードを掘り下げた後、線形回帰機能が組み込まれていないようです-これは純粋に関数に基づいていますただし、名前。

単純な回帰分析を提供する Javascript ライブラリを知っている人はいますか?


そのようにライブラリを使用できることを願っています...

配列に散布点のセットがある場合、それをvar points = [[3,4],[15,45],...[23,78]]のような関数に渡すことができ、線形方程式が の場合のlin_reg(points)ようなものを返します。[7.12,3]y = 7.12 x + 3

4

7 に答える 7

27

どのような線形回帰ですか? 最小二乗法のような単純なものについては、自分でプログラムするだけです。

http://mathworld.wolfram.com/LeastSquaresFitting.html

数学はそれほど難しいものではありません。1 時間ほど試してみて、難しすぎる場合はお知らせください。試すことができます。

編集:

それをした人を見つけました:

http://dracoblue.net/dev/linear-least-squares-in-javascript/159/

于 2011-06-01T01:32:50.713 に答える
24

当面の質問に対して私が見つけた最も簡単な解決策は、次の投稿にあります

線形方程式に加えて、R2 スコアも返されることに注意してください。これは便利です。

** 編集 **

実際のコード スニペットは次のとおりです。

function linearRegression(y,x){
        var lr = {};
        var n = y.length;
        var sum_x = 0;
        var sum_y = 0;
        var sum_xy = 0;
        var sum_xx = 0;
        var sum_yy = 0;

        for (var i = 0; i < y.length; i++) {

            sum_x += x[i];
            sum_y += y[i];
            sum_xy += (x[i]*y[i]);
            sum_xx += (x[i]*x[i]);
            sum_yy += (y[i]*y[i]);
        } 

        lr['slope'] = (n * sum_xy - sum_x * sum_y) / (n*sum_xx - sum_x * sum_x);
        lr['intercept'] = (sum_y - lr.slope * sum_x)/n;
        lr['r2'] = Math.pow((n*sum_xy - sum_x*sum_y)/Math.sqrt((n*sum_xx-sum_x*sum_x)*(n*sum_yy-sum_y*sum_y)),2);

        return lr;
}

これを使用するには、既知の y と既知の x の 2 つの配列を渡すだけでよいため、次のように渡すことができます。

var known_y = [1, 2, 3, 4];
var known_x = [5.2, 5.7, 5.0, 4.2];

var lr = linearRegression(known_y, known_x);
// now you have:
// lr.slope
// lr.intercept
// lr.r2
于 2015-07-22T14:56:19.787 に答える
7

https://web.archive.org/web/20150523035452/https://cgwb.nci.nih.gov/cgwbreg.html (javascript 回帰計算機)を確認して ください- 純粋な JavaScript であり、サーバーへの CGI 呼び出しではありません。データと処理はコンピュータに残ります。R スタイルの結果と R コードを完成させて、作業と結果の視覚化を確認します。

OLS の埋め込み JavaScript 実装と結果に関連付けられた統計のソース コードを参照してください。

このコードは、GSL ライブラリ関数を JavaScript に移植するための私の取り組みです。

基本的に GPL ライセンスの Gnu Scientific Library (GSL) コードを移植するための行であるため、コードは GPL の下でリリースされます。

編集: Paul Lutus は、リグレッション用の GPL コードもいくつか提供しています: http://arachnoid.com/polysolve/index.html

于 2012-10-20T18:13:46.937 に答える
5

以下は、トリプレット (x, y, r) の配列を受け取るスニペットです。ここで、r は (x, y) データ ポイントの重みであり、[a, b] を返します。Y = a*X + b は、データ。

// return (a, b) that minimize
// sum_i r_i * (a*x_i+b - y_i)^2
function linear_regression( xyr )
{
    var i, 
        x, y, r,
        sumx=0, sumy=0, sumx2=0, sumy2=0, sumxy=0, sumr=0,
        a, b;

    for(i=0;i<xyr.length;i++)
    {   
        // this is our data pair
        x = xyr[i][0]; y = xyr[i][1]; 

        // this is the weight for that pair
        // set to 1 (and simplify code accordingly, ie, sumr becomes xy.length) if weighting is not needed
        r = xyr[i][2];  

        // consider checking for NaN in the x, y and r variables here 
        // (add a continue statement in that case)

        sumr += r;
        sumx += r*x;
        sumx2 += r*(x*x);
        sumy += r*y;
        sumy2 += r*(y*y);
        sumxy += r*(x*y);
    }

    // note: the denominator is the variance of the random variable X
    // the only case when it is 0 is the degenerate case X==constant
    b = (sumy*sumx2 - sumx*sumxy)/(sumr*sumx2-sumx*sumx);
    a = (sumr*sumxy - sumx*sumy)/(sumr*sumx2-sumx*sumx);

    return [a, b];
}
于 2012-04-27T14:52:39.517 に答える
1

Nic Mabonの回答に多少基づいています。

function linearRegression(x, y)
{
    var xs = 0;  // sum(x)
    var ys = 0;  // sum(y)
    var xxs = 0; // sum(x*x)
    var xys = 0; // sum(x*y)
    var yys = 0; // sum(y*y)

    var n = 0;
    for (; n < x.length && n < y.length; n++)
    {
        xs += x[n];
        ys += y[n];
        xxs += x[n] * x[n];
        xys += x[n] * y[n];
        yys += y[n] * y[n];
    }

    var div = n * xxs - xs * xs;
    var gain = (n * xys - xs * ys) / div;
    var offset = (ys * xxs - xs * xys) / div;
    var correlation = Math.abs((xys * n - xs * ys) / Math.sqrt((xxs * n - xs * xs) * (yys * n - ys * ys)));

    return { gain: gain, offset: offset, correlation: correlation };
}

y' = x * ゲイン + オフセット。

于 2015-06-10T10:02:55.827 に答える