public void RegressTest2() { // The multivariate linear regression is a generalization of // the multiple linear regression. In the multivariate linear // regression, not only the input variables are multivariate, // but also are the output dependent variables. // In the following example, we will perform a regression of // a 2-dimensional output variable over a 3-dimensional input // variable. double[][] inputs = { // variables: x1 x2 x3 new double[] { 1, 1, 1 }, // input sample 1 new double[] { 2, 1, 1 }, // input sample 2 new double[] { 3, 1, 1 }, // input sample 3 }; double[][] outputs = { // variables: y1 y2 new double[] { 2, 3 }, // corresponding output to sample 1 new double[] { 4, 6 }, // corresponding output to sample 2 new double[] { 6, 9 }, // corresponding output to sample 3 }; // With a quick eye inspection, it is possible to see that // the first output variable y1 is always the double of the // first input variable. The second output variable y2 is // always the triple of the first input variable. The other // input variables are unused. Nevertheless, we will fit a // multivariate regression model and confirm the validity // of our impressions: // Create a new multivariate linear regression with 3 inputs and 2 outputs var regression = new MultivariateLinearRegression(3, 2); // Now, compute the multivariate linear regression: double error = regression.Regress(inputs, outputs); // At this point, the regression error will be 0 (the fit was // perfect). The regression coefficients for the first input // and first output variables will be 2. The coefficient for // the first input and second output variables will be 3. All // others will be 0. // // regression.Coefficients should be the matrix given by // // double[,] coefficients = { // { 2, 3 }, // { 0, 0 }, // { 0, 0 }, // }; // // The first input variable coefficients will be 2 and 3: Assert.AreEqual(2, regression.Coefficients[0, 0], 1e-10); Assert.AreEqual(3, regression.Coefficients[0, 1], 1e-10); // And all other coefficients will be 0: Assert.AreEqual(0, regression.Coefficients[1, 0], 1e-10); Assert.AreEqual(0, regression.Coefficients[1, 1], 1e-10); Assert.AreEqual(0, regression.Coefficients[2, 0], 1e-10); Assert.AreEqual(0, regression.Coefficients[2, 1], 1e-10); // We can also check the r-squared coefficients of determination: double[] r2 = regression.CoefficientOfDetermination(inputs, outputs); // Which should be one for both output variables: Assert.AreEqual(1, r2[0]); Assert.AreEqual(1, r2[1]); foreach (var e in regression.Coefficients) Assert.IsFalse(double.IsNaN(e)); Assert.AreEqual(0, error, 1e-10); Assert.IsFalse(double.IsNaN(error)); }
private void btnRegress_Click(object sender, EventArgs e) { if (pls == null || dgvRegressionInput.DataSource == null) { MessageBox.Show("Please compute the analysis first."); return; } int components = (int)numComponentsRegression.Value; regression = pls.CreateRegression(components); DataTable table = dgvRegressionInput.DataSource as DataTable; DataTable inputTable = table.DefaultView.ToTable(false, inputColumnNames); DataTable outputTable = table.DefaultView.ToTable(false, outputColumnNames); double[][] sourceInput = Matrix.ToArray(inputTable as DataTable); double[][] sourceOutput = Matrix.ToArray(outputTable as DataTable); double[,] result = Matrix.ToMatrix(regression.Compute(sourceInput)); double[] rSquared = regression.CoefficientOfDetermination(sourceInput, sourceOutput, cbAdjusted.Checked); dgvRegressionOutput.DataSource = new ArrayDataView(result, outputColumnNames); dgvRSquared.DataSource = new ArrayDataView(rSquared, outputColumnNames); }