多元线性回归—C语言

上篇已经介绍过简单线性回归了,这篇介绍第二个算法,多元线性回归,仅介绍两个主要函数:预测函数和训练函数。

算法介绍

模型可以如下表示:
y = b 0 + b 1 × x 1 + b 2 × x 2 + . . . y = b_0+b_1×x_1+b_2×x_2+... y=b0+b1×x1+b2×x2+...

随机梯度下降法

多元线性回归采用的是随机梯度下降方法,该方法具体介绍同样自行百度,在这里不做详细介绍。仅介绍C语言实现方法

这里给出更新方程:
b = b − l e a r n i n g   r a t e × e r r o r × x b = b-learning\space rate × error × x b=blearning rate×error×x

函数

读取csv

  • 以下三个函数分别为获取行数、获取列数、获取文本内容。
double **dataset;
int row,col;

int get_row(char *filename)//获取行数
{
	char line[1024];
	int i = 0;
	FILE* stream = fopen(filename, "r");
	while(fgets(line, 1024, stream)){
		i++;
	}
	fclose(stream);
	return i;
}

int get_col(char *filename)//获取列数
{
	char line[1024];
	int i = 0;
	FILE* stream = fopen(filename, "r");
	fgets(line, 1024, stream);
	char* token = strtok(line, ",");
	while(token){
		token = strtok(NULL, ",");
		i++;
	}
	fclose(stream);
	return i;
}

void get_two_dimension(char* line, double** data, char *filename)
{
	FILE* stream = fopen(filename, "r");
	int i = 0;
	while (fgets(line, 1024, stream))//逐行读取
    {
    	int j = 0;
    	char *tok;
        char* tmp = strdup(line);
        for (tok = strtok(line, ","); tok && *tok; j++, tok = strtok(NULL, ",\n")){
        	data[i][j] = atof(tok);//转换成浮点数
		}//字符串拆分操作
        i++;
        free(tmp);
    }
    fclose(stream);//文件打开后要进行关闭操作
}

EXAMPLE

int main()
{
	char filename[] = "data.csv";
    char line[1024];
    double **data;
    int row, col;
    row = get_row(filename);
    col = get_col(filename);
    data = (double **)malloc(row * sizeof(int *));
	for (int i = 0; i < row; ++i){
		data[i] = (double *)malloc(col * sizeof(double));
	}//动态申请二维数组
	get_two_dimension(line, data, filename);
	printf("row = %d\n", row);
	printf("col = %d\n", col);

	int i, j;
	for(i=0; i<row; i++){
		for(j=0; j<col; j++){

	float mean = (float)(sum / length);
	return mean;
}

随机梯度下降估计回归系数

更新方程:
KaTeX parse error: Undefined control sequence: \ at position 29: …iction-expected\̲ ̲

b 1 ( t + 1 ) = b 1 ( t ) − l e a r n i n g   r a t e × e r r o r ( t ) × x 1 ( t ) b_1(t+1) = b_1(t) - learning\space rate × error(t) × x_1(t) b1(t+1)=b1(t)learning rate×error(t)×x1(t)

b 0 ( t + 1 ) = b 0 ( t ) − l e a r n i n g   r a t e × e r r o r ( t ) b_0(t+1) = b_0(t) - learning\space rate × error(t) b0(t+1)=b0(t)learning rate×error(t)

// 参数为:数据集、每个数据集属性个数(带label)、存放系数的数组、学习率、epoch、train_size
double* coefficients_sgd(double** dataset,int col,double coef[], double l_rate, int n_epoch, int train_size) {
	int i;
	for (i = 0; i < n_epoch; i++) {
		int j = 0;//遍历每一行
		for (j = 0; j < train_size; j++) {
			double yhat = predict(col,dataset[j], coef);
			double err = yhat - dataset[j][col - 1];
			coef[0] -= l_rate * err;
			int k;
			for (k = 0; k < col - 1; k++) {
				coef[k + 1] -= l_rate * err*dataset[j][k];
			}
		}
	}
	for (i = 0; i < col; i++) {
		printf("coef[i]=%f\n", coef[i]);
	}
	return coef;
}

预测函数

// 参数:样本属性个数、样本、系数
double predict(int col,double array[], double coefficients[]) {//预测某一行的值
	double yhat = coefficients[0];
	int i;
	for (i = 0; i < col; i++)
		yhat += coefficients[i + 1] * array[i];
	return yhat;
}
  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线性回归是一种广泛使用的监督学习算法,它可以用于预测数值型变量的值。下面是一个用 C 语言实现的简单线性回归的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define LEARNING_RATE 0.01 // 学习率 #define MAX_ITERATIONS 1000 // 最大迭代次数 // 线性回归模型 double linear_regression(double x[], double y[], int n, double *b) { double sum_x = 0.0, sum_y = 0.0, sum_xy = 0.0, sum_xx = 0.0; for (int i = 0; i < n; i++) { sum_x += x[i]; sum_y += y[i]; sum_xy += x[i] * y[i]; sum_xx += x[i] * x[i]; } double x_mean = sum_x / n; double y_mean = sum_y / n; double denominator = sum_xx - sum_x * x_mean; if (denominator == 0.0) { return 0.0; } *b = (sum_xy - sum_x * y_mean) / denominator; return y_mean - *b * x_mean; } int main() { // 样本数据 double x[] = {1.0, 2.0, 3.0, 4.0, 5.0}; double y[] = {1.5, 3.2, 4.8, 6.9, 8.3}; int n = 5; double b; // 斜率 double a = linear_regression(x, y, n, &b); // 截距 printf("a = %f, b = %f\n", a, b); // 预测新数据 double x_new = 6.0; double y_new = a + b * x_new; printf("y_new = %f\n", y_new); return 0; } ``` 在这个示例中,我们使用了样本数据 `x` 和 `y`,分别表示自变量和因变量。然后我们使用 `linear_regression` 函数求出回归方程的截距和斜率,并用 `a` 和 `b` 变量保存它们的值。最后,我们可以用回归方程预测新数据 `x_new` 对应的因变量 `y_new`。 这个示例中的线性回归模型是一个简单的一元线性回归模型。如果要处理多元线性回归问题,需要对代码进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值