多元回归分析--错误求指正

这是我从书上看到的代码,但是第一个函数chlk(乔利斯基分解法)就已经错误了。


#include<stdio.h>
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int chlk(double a[], int n, int m, double d[])
{
	int i, j, k, u, v;
	
		if ((a[0] + 1.0 == 1.0) || (a[0] < 0.0))return (0);
		a[0] = sqrt(a[0]);
	for (j = 1; j <= n - 1; j++)a[j] = a[j] / a[0];
	for (i = 1; i <= n - 1; i++)
	{
		u = i * n + i;
		for (j = 1; j <= i; j++)
		{
			v = (j - 1) * n + i;
			a[u] = a[u] - a[v] * a[v];
		}
		if ((a[u] + 1.0 == 1.0) || (a[u] < 0.0)) return(0);
		a[u] = sqrt(a[u]);
		if (i != (n - 1))
		{
			for (j = i + 1; j <= n - 1; j++)
			{
				v = i * n + j;
				for (k = 1; k <= i; k++)a[v] = a[v] - a[(k - 1) * n + i] * a[(k - 1) * n + j];
				a[v] = a[v] / a[u];
			}
			;
		}
	}
	for (j = 0; j <= m - 1; j++)
	{
		d[j] = d[j] / a[0];
		for (i = 1; i <= n - 1; i++)
		{
			u = i * n + i;
			v = i * m + j;
			for (k = 1; k <= i; k++)
				d[v] = d[v] - a[(k - 1) * n + i] * d[(k - 1) * m + j];
			d[v] = d[v] / a[u];
		}
	}
	for (j = 0; j < m - 1; j++)
	{
		u = (n - 1) * m + j;
		d[u] = d[u] / a[n * n - 1];
		for (k = n - 1; k >= 1; k--)
		{
			u = (k - 1) * m + j;
			for (i = k; i <= n - 1; i++)
			{
				v = (k - 1) * n + i;
				d[u] = d[u] - a[v] * d[i * m + j];
			}
			v = (k - 1) * n + k - 1;
			d[u] = d[u] / a[v];
		}
		
	}
	return (2);
}
/*void sqt2(int m, int n, double x[], double y[], double a[], double data[4], double v[])
{
	int i, j, k, mm;
	double q, e, u, p, yy, s, r, pp, * b;
	b = new double[(m + 1) * (m + 1)];
	mm = m + 1;
	b[mm * mm - 1] = n;
	for (j = 0; j < m - 1; j++)
	{
		p = 0.0;
		for (i = 0; i < n - 1; i++)p = p + x[j * n + i];
		b[(m * mm) + j] = p;
		b[(j * mm) + m] = p;
	}
	for (i = 0; i <= m - 1; i++)
		for (j = 0; j <= m - 1; j++)
		{
			p = 0.0;
			for (k = 0; k <= n - 1; k++)p = p + x[i * n + k] * x[j * n + k];
			b[j * mm + i] = p;
			b[i * mm + j] = p;
		}
	a[m] = 0.0;
	for (i = 0; i <= n - 1; i++)a[m] = a[m] + y[i];
	for (i = 0; i <= m - 1; i++)
	{
		a[i] = 0.0;
		for (j = 0; j <= n - 1; j++)a[i] = a[i] + x[i * n + j] * y[j];
	}
	chlk(b, mm, 1, a);
	yy = 0.0;
	for (i = 0; i <= n - 1; i++)yy = yy + y[i] / n;
	q = 0.0; e = 0.0; u = 0.0;
	for (i = 0; i <= n - 1; i++)
	{
		p = a[m];
		for (j = 0; j <= m - 1; j++) p = p + a[j] * x[j * n + i];
		q = q + (y[i] - p) * (y[i] - p);
		e = e + (y[i] - yy) * (y[i] - yy);
		u = u + (yy - p) * (yy - p);
	}
	s = sqrt(q / n);
	r = sqrt(1.0 - q / e);
	for (j = 0; j <= m - 1; j++)
	{
		p = 0.0;
		for (i = 0; i <= n - 1; i++)
		{
			pp = a[m];
			for (k = 0; k <= m - 1; k++)
				if (k != j)pp = pp + a[k] * x[k * n + i];
			p = p + (y[i] - pp) * (y[i] - pp);
		}
		v[j] = sqrt(1.0 - q / p);
	}
	data[0] = q;
	data[1] = s;
	data[2] = r;
	data[3] = u;
	delete[]b;
	return;

}
*/
int main()
{
	int i;
	double a[4][4] = { {5.0,7.0,6.0,5.0},{7.0,10.0,8.0,7.0},{6.0,8.0,1.0,9.0},{5.0,7.0,9.0,10.0} };
	double d[4][2] = { {23.0,92.0},{32.0,128.0},{33.0,132.0},{31.0,124.0} };
	i = chlk(&a[0][0], 4, 2, &d[0][0]);
	//if (i <= 0)return 0;
	for (i = 0; i <= 3; i++)
	{
		cout << "x(" << i << ")=" << setw(15) << d[i][0] << setw(15) << d[i][1] << endl;

	}

	/*double data[4], a[4], v[3];
	double x[3][5] = { {1.1,1.0,1.2,1.1,0.9},{2.0,2.0,1.8,1.9,2.1},{3.2,3.2,3.0,2.9,2.9} };
	double y[5] = { 10.1,10.2,10.0,10.1,10.0 };
	sqt2(3, 5, &x[0][0], y, a, data, v);

	cout << "回归系数" << endl;
	for (int i = 0; i <= 3; i++) cout << "a[" << i << "] = " << a[i] << endl;
	cout << "偏差平方和:" << data[0] << endl;
	cout << "平均标准偏差:" << data[1] << endl;
	cout << "复相关系数" << data[2] << endl;
	cout << "回归平方和:" << data[3] << endl;
	cout << "偏相关系数:" << endl;
	for (int i = 0; i <= 2; i++) cout << "v[" << i << "]=" << v[i] << endl;*/
	return 0;
}

/**/处错误答案:

在这里插入图片描述/**/实际答案:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值