O_O*_*O_O 22 c algorithm least-squares
我试图在2个数据阵列上实现线性最小二乘拟合:时间与幅度.到目前为止,我所知道的唯一技术是测试(y = m*x + b)中所有可能的m和b点,然后找出哪种组合最适合我的数据,以便它具有最小的误差.但是,我认为迭代这么多组合有时是无用的,因为它测试了所有东西.有没有什么技术可以加快我不了解的过程?谢谢.
Mar*_*ata 40
试试这个代码.它适合y = mx + b您的(x,y)数据.
争论linreg是
linreg(int n, REAL x[], REAL y[], REAL* b, REAL* m, REAL* r)
n = number of data points
x,y = arrays of data
*b = output intercept
*m = output slope
*r = output correlation coefficient (can be NULL if you don't want it)
Run Code Online (Sandbox Code Playgroud)
成功时返回值为0,失败时返回值= 0.
这是代码
#include "linreg.h"
#include <stdlib.h>
#include <math.h> /* math functions */
//#define REAL float
#define REAL double
inline static REAL sqr(REAL x) {
return x*x;
}
int linreg(int n, const REAL x[], const REAL y[], REAL* m, REAL* b, REAL* r){
REAL sumx = 0.0; /* sum of x */
REAL sumx2 = 0.0; /* sum of x**2 */
REAL sumxy = 0.0; /* sum of x * y */
REAL sumy = 0.0; /* sum of y */
REAL sumy2 = 0.0; /* sum of y**2 */
for (int i=0;i<n;i++){
sumx += x[i];
sumx2 += sqr(x[i]);
sumxy += x[i] * y[i];
sumy += y[i];
sumy2 += sqr(y[i]);
}
REAL denom = (n * sumx2 - sqr(sumx));
if (denom == 0) {
// singular matrix. can't solve the problem.
*m = 0;
*b = 0;
if (r) *r = 0;
return 1;
}
*m = (n * sumxy - sumx * sumy) / denom;
*b = (sumy * sumx2 - sumx * sumxy) / denom;
if (r!=NULL) {
*r = (sumxy - sumx * sumy / n) / /* compute correlation coeff */
sqrt((sumx2 - sqr(sumx)/n) *
(sumy2 - sqr(sumy)/n));
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
int main()
{
int n = 6;
REAL x[6]= {1, 2, 4, 5, 10, 20};
REAL y[6]= {4, 6, 12, 15, 34, 68};
REAL m,b,r;
linreg(n,x,y,&m,&b,&r);
printf("m=%g b=%g r=%g\n",m,b,r);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
m=3.43651 b=-0.888889 r=0.999192
Run Code Online (Sandbox Code Playgroud)
所有值都与上面的C代码完全一致(注意C代码r在Excel返回时返回R**2).
| 归档时间: |
|
| 查看次数: |
54289 次 |
| 最近记录: |