📄 fit.java
字号:
/*
*@(#)Fit.java 2.0 2005/04/30
*
*清华大学 精密仪器与机械学系
*范灿升 fancansheng@163.com
*/
package algorithm;
import algorithm.LinearEquation;
/**
*这个类是数据拟合所需用到的类,包括一元线性回归、多项式回归、多元线性回归、三次样条插值等。
*@version 2.0, 2005/04/30
*@author 范灿升
*@see Modeling
*@see input.FitInput
*/
public class Fit
{
private double[][] xMatrix;
private double[] yMatrix;
private double[] coef;//回归系数
private double[] yExpected;//y的期望值
private double yAverage;
private int n;//自变量个数
private int m;//数据组数
private double u;//回归平方和
private double lyy;//总离差平方和
/**
*构造拟合与插值类。
*@param xMatrix 自变量数据对应的矩阵,这个矩阵在Fit类中产生克隆副本,Fit的成员方法不会对该矩阵生产影响。
*@param yMatrix 因变量数据对应的矩阵,这个矩阵在Fit类中产生克隆副本,Fit的成员方法不会对该矩阵生产影响。
*/
public Fit(double[][] xMatrix,double[] yMatrix)
{
this.xMatrix=(double[][])xMatrix.clone();
this.yMatrix=(double[])yMatrix.clone();
m=yMatrix.length;
n=xMatrix[0].length-1;//xMatrix的第一列为1
}
/**
*多元线性回归。
*@return double[]类的实例,它的成员域length为n+2,其中前n+1个元素为回归方程中的系数A0、A1、A2……An。
*最后一个元素为相关系数,它越接近1,表示回归效果越显著。
*<p>如果数据错误以致生成的线性方程组无解则返回null。
*/
public double[] multiFit()
{
double[] result=new double[n+2];
double[][] equationCoefficients;
double[] equationConstants;
int i;
try
{
equationCoefficients=Matrix.product(Matrix.transpose(xMatrix),xMatrix);
equationConstants=Matrix.product(Matrix.transpose(xMatrix),yMatrix);
coef=new LinearEquation(equationCoefficients,equationConstants).solve();
for(i=0;i<coef.length;i++)
result[i]=coef[i];
result[n+1]=rCoefficent();
return result;
}
catch(NullPointerException e)
{
return null;
}
//矩阵变换和解方程时可能产生很多null
}
/**
*计算相关系数。
*@return 回归分析的相关系数
*/
public double rCoefficent()
{
yAverage=0;
int i,j;
yExpected=new double[m];
for(i=0;i<m;i++)
{
yAverage+=yMatrix[i];
yExpected[i]=0;
}
yAverage/=m;
for(i=0;i<m;i++)
{
for(j=0;j<n+1;j++)
yExpected[i]+=
(coef[j]*
xMatrix[i][j]);
}
//计算y的期望值
u=0;
lyy=0;
for(i=0;i<m;i++)
{
u+=((yExpected[i]-yAverage)*(yExpected[i]-yAverage));
lyy+=((yMatrix[i]-yAverage)*(yMatrix[i]-yAverage));
}
double r=Math.sqrt(u/lyy);
return r;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -