最佳拟合直线_JAVA
Description
在很多情況下,天文觀測得到的數(shù)據(jù)是一組包含很大數(shù)量的序列點圖象,每一點用x值和y值定義。這就可能需要畫一條通過這些點的最佳擬合曲線。
為了避免只對個別數(shù)據(jù)分析,需要進行最佳曲線擬合。考慮N個數(shù)據(jù)點,它們的坐標是(X1,Y1),(X2,Y2)…,(XN,YN)。假設(shè)這些值中的X是嚴格的精確值,Y的值是測量值(含有一些誤差)。
對于一個給定的X,如X1,對應(yīng)的值Y1與曲線C上對應(yīng)的Y值將存在一個差值。我們用D1表示這個差值,有時我們也稱這個差值為偏差、誤差或殘差,它可能是正、負或零。類似的,X2…,XN,對應(yīng)的差值為D2,…,DN。
我們用D12 + D22 + … + DN2 作為衡量曲線C擬合的“最佳”程度,這個值越小越好,越大則越不好。因此,我們做以下定義:任何一種類型的曲線,它們都有一個共同的特性,當ΣDi2最小時,稱為最佳擬合曲線。注:∑指“取和”計算。 一條曲線具有這一特性時,稱之為“最小二乘擬合”,這樣的曲線稱為“最小二乘曲線”。
本次的計算任務(wù)是擬合為一條直線,數(shù)學(xué)上稱之為“線性回歸”。“回歸”一詞看起來有點陌生,因為計算最佳曲線沒什么好“回歸”的,最好的術(shù)語就是“曲線似合”,在直線情況下就是“線性曲線擬合”。
你的任務(wù)是編寫程序用最小二乘法計算出以下線性方程的系數(shù)(斜率a以及y軸的截距b):
y = a*x + b (4.1)
a和b可以使用以下公式計算:
式中N是數(shù)據(jù)點的個數(shù)。注意,以上兩式具有相同的分母,∑指逐項加法計算(取和)。∑x指對所有的x值求和,∑y指對所以的y值求和,∑(x^2)指對所有x的平方求和。∑xy指對所有的積xy進行取和計算。應(yīng)注意,∑xy 與 ∑x*∑y是不相同的(“積的和”與“和的積”是不同的),同樣(∑x)2與∑(x2)也是不相同的(“和的平方”與“平方的和”是不相同的)。
Input
n組整數(shù)表示xi,yi ,期中|x|<=106,|y|<=106, n < 15
Output
最佳擬合曲線參數(shù)a和b,a和b各占一行,a 和b精確到小數(shù)點后3位。
Sample
Input
4
1 6
2 5
3 7
4 10
Output
1.400
3.500
Hint
import java.util.*;class Num {int n;double x[];double y[];public Num(int n, double[] x, double[] y) {super();this.n = n;this.x = x;this.y = y;}public double sum(double x[]) {double sum = 0;for(int i = 0; i < n; i++) {sum += x[i];}return sum;}public double sumxy(double x[], double y[]) {double xy[] = new double[16];for(int i = 0; i < n; i++)xy[i] = x[i] * y[i];return sum(xy);}public double sumx2(double x[]) {double x2[] = new double[16];for(int i = 0; i < n; i++)x2[i] = x[i] * x[i];return sum(x2);}public double fenmu() {return n * sumx2(x) - sum(x) * sum(x);}public double afenzi() {return n * sumxy(x, y) - sum(x) * sum(y);}public double bfenzi() {return sum(y) * sumx2(x) - sum(x) * sumxy(x, y);}public double a() {return afenzi() * 1.0 / fenmu();}public double b() {return bfenzi() * 1.0 / fenmu();} }public class Main {public static void main(String[] args) {Scanner reader = new Scanner(System.in);int n = reader.nextInt();double x[] = new double[16];double y[] = new double[16];for(int i = 0; i < n; i++) {x[i] = reader.nextDouble();y[i] = reader.nextDouble();}Num num = new Num(n, x, y);System.out.printf("%.3f\n%.3f", num.a(), num.b());reader.close();}}總結(jié)
以上是生活随笔為你收集整理的最佳拟合直线_JAVA的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最大矩形面积_JAVA
- 下一篇: 织女的红线_JAVA