精华内容
下载资源
问答
  • 简单线性回归c语言实现,计算偏差平方和,平均标准偏差,回归平方和,偏差平均值
  • 线性回归学习算法c语言实现Linear Search is basically a sequential search algorithm. 线性搜索基本上是一种顺序搜索算法 。 In this algorithm, the key element is searched in the given input array in ...

    线性回归学习算法c语言实现

    Linear Search is basically a sequential search algorithm.

    线性搜索基本上是一种顺序搜索算法

    In this algorithm, the key element is searched in the given input array in sequential order.

    在此算法中,键元素按给定顺序在给定的输入数组中搜索。

    If the key element is found in the input array, it returns the element.

    如果在输入数组中找到key元素,它将返回该元素。



    线性搜索算法 (Linear Search Algorithm)

    Linear_Search ( Array X, Value i)

    Linear_Search(数组X,值i)

    • Set j to 1

      将j设为1
    • If j > n, jump to step 7

      如果j> n,则跳至步骤7
    • If X[j] == i, jump to step 6

      如果X [j] == i,则跳至步骤6
    • Then, increment j by 1 i.e. j = j+1

      然后,将j加1,即j = j + 1
    • Go back to step 2

      返回步骤2
    • Display the element i which is found at particular index i, then jump to step 8

      显示在特定索引i处找到的元素i,然后跳到步骤8
    • Display element not found in the set of input elements.

      在输入元素集中找不到显示元素。
    • Exit/End

      退出/结束


    线性搜索的伪代码 (Pseudo Code for Linear Search)

    
    procedure LINEAR_SEARCH (array, key)
    
       for each item in the array
          if match element == key
             return element's index
          end if
       end for
    
    end procedure
    


    C语言中线性搜索的实现 (Implementation of Linear Search in C)

    • Initially, we need to mention or accept the element to be searched from the user.

      首先,我们需要提及或接受用户要搜索的元素。
    • Then, we create a for loop and start searching for the element in a sequential fashion.

      然后,我们创建一个for循环并开始按顺序搜索元素。
    • As soon as the compiler encounters a match i.e. array[element] == key value, return the element along with its position in the array.

      编译器遇到匹配项即array [element] ==键值后,立即返回元素及其在数组中的位置。
    • If no values are found that match the input, it returns -1.

      如果找不到与输入匹配的值,则返回-1。
    Linear Search
    Linear Search 线性搜寻
    
    #include <stdio.h> 
    
    int LINEAR_SEARCH(int inp_arr[], int size, int val) 
    { 
    	 
    	for (int i = 0; i < size; i++) 
    		if (inp_arr[i] == val) 
    			return i; 
    	return -1; 
    } 
    
    
    int main(void) 
    { 
    	int arr[] = { 10, 20, 30, 40, 50, 100, 0 }; 
    	int key = 100; 
    	int size = 10; 
    	int res = LINEAR_SEARCH(arr, size, key); 
    	if (res == -1)
    	printf("ELEMENT NOT FOUND!!");
        else
        printf("Item is present at index %d", res);
        
    	return 0; 
    } 
    

    Output:

    输出:

    
    Item is present at index 5
    

    线性搜索的时间复杂度 (Time Complexity of Linear Search)

    The best-case complexity is O(1) if the element is found in the first iteration of the loop.

    如果在循环的第一次迭代中找到元素,则最佳情况下的复杂度为O(1)

    The worst-case time complexity is O(n), if the search element is found at the end of the array, provided the size of the array is n.

    如果在数组的末尾找到搜索元素,则最坏情况下的时间复杂度是O(n) ,前提是数组的大小为n。



    结论 (Conclusion)

    Thus, in this article, we have understood and implemented Linear Search Algorithm.

    因此,在本文中,我们已经理解并实现了线性搜索算法。

    翻译自: https://www.journaldev.com/35170/linear-search-algorithm-c

    线性回归学习算法c语言实现

    展开全文
  • 简单的一元线性回归算法已经在这里“C语言简单的一元线性回归算法”,并且也简单阐述了梯度求解推导过程。 今天我们再呈上多元线性回归算法梯度下降的C语言实现,代码中已经加入了相应的注释。如下: ...

    简单的一元线性回归算法已经在这里“C语言简单的一元线性回归算法”,并且也简单阐述了梯度求解推导过程。

    今天我们再呈上多元线性回归算法梯度下降的C语言实现,代码中已经加入了相应的注释。如下:

    MultipleLinearRegression.h

    #ifndef MULTIPLELINEARREGRESSION_MULTIPLELINEARREGRESSION_H
    #define MULTIPLELINEARREGRESSION_MULTIPLELINEARREGRESSION_H
    
    //设置样本数为 10
    #define SAMPLE_COUNT    10
    
    //设置参数个数为 6
    #define PARAMETER_COUNT  6
    
    
    void init(double learning_rate, long int X_Len,long int X_arg_count,int channel);
    
    void fit(double train_x[SAMPLE_COUNT][PARAMETER_COUNT],double train_y[PARAMETER_COUNT],double temp[PARAMETER_COUNT],double theta[PARAMETER_COUNT]);
    
    double _f(const double train_x[PARAMETER_COUNT],double theta[PARAMETER_COUNT]);
    
    double* predict(double train_x[SAMPLE_COUNT][PARAMETER_COUNT],double theta[PARAMETER_COUNT]);
    
    double loss(double train_x[SAMPLE_COUNT][PARAMETER_COUNT],double train_y[PARAMETER_COUNT],
                double temp[PARAMETER_COUNT],double *loss_val);
    
    void calc_gradient(double train_x[SAMPLE_COUNT][PARAMETER_COUNT],double train_y[PARAMETER_COUNT],double *temp,double *theta);
    
    void train_step(double temp[PARAMETER_COUNT],double theta[PARAMETER_COUNT]);
    
    
    #endif //MULTIPLELINEARREGRESSION_MULTIPLELINEARREGRESSION_H
    

    MultipleLinearRegression.h

    
    #include "MultipleLinearRegression.h"
    #include <stdio.h>
    #include <malloc.h>
    
    
    //int type_count = 5;
    
    int g_X_Len = 10;
    double g_learning_rate = 0.01;
    int g_X_arg_count = 5;
    int g_channel = 1;
    
    
    double g_out_Y_pt = 0;
    //预测输出值指针
    double *y_pred_pt = 0;
    
    
    //损失值
    double loss_val[1] = {1.0};
    
    
    
    /*
     * learning_rate  学习率
     *
     * X_Len 样本个数
     *
     * X_arg_count 参数个数
     *
     * channel 通道数<暂未考虑>
     * */
    void init(double learning_rate, long int X_Len,long int X_arg_count,int channel){
        g_learning_rate = learning_rate;
        g_X_Len = X_Len;
        g_X_arg_count = X_arg_count;
        g_channel = channel;
        y_pred_pt = malloc((size_t) X_Len);
    }
    
    void fit(double train_x[SAMPLE_COUNT][PARAMETER_COUNT],double train_y[PARAMETER_COUNT],
            double temp[PARAMETER_COUNT],double theta[PARAMETER_COUNT]){
        for (int i = 0; i < 10000; ++i) {
            printf("step %d: \n", i);
            calc_gradient(train_x,train_y,temp,theta);
            loss_val[0] = loss(train_x,train_y,theta,loss_val);
        }
    }
    
    double _f(const double train_x[PARAMETER_COUNT],double theta[PARAMETER_COUNT]){
    
        g_out_Y_pt = -1;
        for (int i = 0; i < PARAMETER_COUNT; ++i) {
            g_out_Y_pt += theta[i]*train_x[i];
    
        }
        return g_out_Y_pt;
    }
    
    //预测
    double* predict(double train_x[SAMPLE_COUNT][PARAMETER_COUNT],double theta[PARAMETER_COUNT]){
        for (int i = 0; i < SAMPLE_COUNT; ++i) {
            y_pred_pt[i] = _f(train_x[i],theta);
        }
        return y_pred_pt;
    }
    
    //求损失
    double loss(double train_x[SAMPLE_COUNT][PARAMETER_COUNT],double train_y[PARAMETER_COUNT],
                double theta[PARAMETER_COUNT],double *loss_val){
        predict(train_x,theta);
        loss_val[0] = -1;
        for (int i = 0; i < SAMPLE_COUNT; i++) {
            loss_val[0] += (train_y[i] - y_pred_pt[i]) * (train_y[i] - y_pred_pt[i]);
        }
        loss_val[0] = loss_val[0] / SAMPLE_COUNT;
    
        printf(" loss_val = %f\n", loss_val[0]);
        return loss_val[0];
    }
    
    //求梯度
    void calc_gradient(double train_x[SAMPLE_COUNT][PARAMETER_COUNT],double train_y[PARAMETER_COUNT],
            double temp[PARAMETER_COUNT], double theta[PARAMETER_COUNT]) {
        for (int i = 0; i < g_X_arg_count -1; i++) {
            double sum = 0;
            for (int j = 0; j < g_X_Len; j++) {
                double hx = 0;
                for (int k = 0; k < g_X_arg_count; k++) {
                    hx += theta[k] * train_x[j][k];
                }
                sum += (hx - train_y[j]) * train_x[j][i];
            }
            temp[i] = sum / g_X_Len * 0.01;
        }
        printf("\n--------------------\n");
        train_step(temp, theta);
    }
    
    //更新参数值
    void train_step(double temp[PARAMETER_COUNT],double theta[PARAMETER_COUNT]) {
        for (int i = 0; i < g_X_arg_count - 1; i++) {
            theta[i] = theta[i] - temp[i];
            printf(" theta[%d] = %f\n",i, theta[i]);
        }
    }
    

    main.c

    //#include "src/LinerRegression.h"
    #include "utils/util.h"
    
    #include "src/MultipleLinearRegression.h"
    
    int main() {
    
    
       // 初始数据 设置为 5个维度;增加第一维为 1 即为 常量值 b
       //该数据由 Y= 4*X1 + 9*X2 + 10*X3 + 2*X4 + 1*X5 + 6 产生(数据中尚为加入噪声)
        double X_pt[10][6] = {{1, 7.41, 3.98, 8.34, 8.0,  0.95},
                              {1, 6.26, 5.12, 9.57, 0.3,  7.79},
                              {1, 1.52, 1.95, 4.01, 7.96, 2.19},
                              {1, 1.91, 8.58, 6.64, 2.99, 2.18},
                              {1, 2.2,  6.88, 0.88, 0.5,  9.74},
                              {1, 5.17, 0.14, 4.09, 9.0,  2.63},
                              {1, 9.13, 5.54, 6.36, 9.98, 5.27},
                              {1, 1.17, 4.67, 9.02, 5.14, 3.46},
                              {1, 3.97, 6.72, 6.12, 9.42, 1.43},
                              {1, 0.27, 3.16, 7.07, 0.28, 1.77}};
        double Y_pt[10] = {171.81, 181.21, 87.84, 165.42, 96.26, 89.47, 181.21, 156.65, 163.83, 108.55};
    
    
        //初始参数函数 temp 只是一个临时变量
        double temp[6] =  {1.0,1.0,1.0,1.0,1.0,1.0};
        double theta[6] = {1.0,1.0,1.0,1.0,1.0,1.0};
    
    
        //初始化相关参数
        init(0.01,10,5+1,1);
        fit(X_pt,Y_pt,temp,theta);
    
    
        return 0;
    }
    

    可以看到再训练10000次的时候损失已经比较小了,各个参数也已经接应我们预设的参数了

    step 9999:
    
    --------------------
     theta[0] = 5.994281
     theta[1] = 3.999957
     theta[2] = 9.000404
     theta[3] = 10.000375
     theta[4] = 2.000242
     loss_val = 0.900745
    
    Process finished with exit code 0

     

    这只是一个C语言的简单实现,学习率也设定的是固定值,训练次数也设定为固定值。如果各位大侠有其他比较好的实现方式欢迎留言推荐。另外由于很久很久不用C语言开发了,肯定会有语法的不完美。如有更好的建议或者其他疑问欢迎交流,小弟恭候。

     

     

     

    展开全文
  • 上一篇我们贴上了简单粗暴的线性回归的代码,里面各种参数都设置的是固定参数,不具有可扩展性,今天我们在上一篇的基础上做了部分改进,当然对于熟悉C语言的大侠来说可能这篇博客会太low了,您完全可以跳过。...

    上一篇我们贴上了简单粗暴的线性回归的代码,里面各种参数都设置的是固定参数,不具有可扩展性,今天我们在上一篇的基础上做了部分改进,当然对于熟悉C语言的大侠来说可能这篇博客会太low了,您完全可以跳过。我们在这里只是讲如何用C语言自己实现一个有实用性的线性回归。有人会说用python不是很简单吗,干嘛费劲巴拉的用C语言实现。首先这里是为了满足某些只支持C语言的环境,例如IOT的部分设备;另外也是为了加深对算法的理解和思考。至于线性回归原理网上到处是,我们在这里只贴一下参数更新的推导过程公式,

    线性回归模型的代价函数是下面这样子:

    其中,f(x)为:

    我们的目标是求最小J(w)

    即在当J(w)取最小值时,对应的W的值,这时候梯度下降就用上了,用公式可表示为如下样式:

    我们把J(w)对w的偏导求出来:

    把(2)带入(1)可得:

    以上就是线性回归中的梯度下降算法。

    下面我们贴上代码,代码中会有比较详细的注释,在这里就不多废话了。

    MultipleLinearRegressionTest.h:

    //
    // Created by lenovo on 2020/7/26.
    //
    
    #ifndef MULTIPLELINEARREGRESSION_MULTIPLELINEARREGRESSIONTEST_H
    #define MULTIPLELINEARREGRESSION_MULTIPLELINEARREGRESSIONTEST_H
    
    //初始化参数
    void init_test(double learning_rate, long int X_Len,long int X_arg_count,int channel,double *y_pred_pt,double* theta_pt,double* temp_pt);
    
    //开始训练
    void fit_test(double *X_pt,double *Y_pt);
    
    #endif //MULTIPLELINEARREGRESSION_MULTIPLELINEARREGRESSIONTEST_H
    

    MultipleLinearRegressionTest.c:

    //
    // Created by lenovo on 2020/7/26.
    //
    
    
    #include <stdio.h>
    #include "MultipleLinearRegressionTest.h"
    
    
    // 样本个数,这里其实是bachsize的意思,只不过我们只有一个bach
    long int g_data_len = 10;
    //学习率
    double g_learning_rate = 0.01;
    //参数个数
    long int g_param_count = 6;
    //通道数
    int g_channel = 1;
    
    
    double g_out_Y_pt = 0;
    //预测输出值指针
    double *g_pred_pt = 0;
    //参数指针
    double *g_theta_pt = 0;
    
    double *temp  = 0;
    
    
    //损失值
    double loss_val = 1.0;
    
    
    //初始化各个参数
    void init_test(double learning_rate, long int data_len,long int param_count,int channel,double *y_pred_pt,double* theta_pt,double*temp_pt){
        g_learning_rate = learning_rate;
        g_data_len = data_len;
        g_param_count = param_count;
        g_channel = channel;
        g_pred_pt = y_pred_pt;
    
        g_theta_pt = theta_pt;
        temp = temp_pt;
    }
    
    
    //更新参数值
    void train_step_test(const double *temp_step, double *theta) {
        for (int i = 0; i < g_param_count; i++) {
            //这里的temp_step[i] 其实就是算出来的梯度值
            theta[i] = theta[i] - temp_step[i];
            printf(" theta[%d] = %f\n",i, theta[i]);
        }
    }
    
    
    //计算一个样本的输出值  y = WX + b
    double f_test(const double *train_x_item,const double *theta){
    
        g_out_Y_pt = -1;
        for (int i = 0; i < g_param_count; ++i) {
            g_out_Y_pt += theta[i]*(*(train_x_item+i));
    
        }
        return g_out_Y_pt;
    }
    
    
    //预测
    double* predict_test(double *train_x,double *theta){
        for (int i = 0; i < g_data_len; ++i) {
            g_pred_pt[i] = f_test(train_x+i*g_param_count,theta);
        }
        return g_pred_pt;
    }
    
    //求损失 
    double loss_test(double *train_x,const double *train_y,
                     double *theta,double loss_val){
        predict_test(train_x,theta);
        loss_val = -1;
        for (int i = 0; i < g_data_len; i++) {
            loss_val += (train_y[i] - g_pred_pt[i]) * (train_y[i] - g_pred_pt[i]);
        }
        //次数计算的是一个bachsize 的平均损失(避免个别离群值引起过拟合)
        loss_val = loss_val / g_data_len;
    
        printf(" loss_val = %f\n", loss_val);
        return loss_val;
    }
    
    //求梯度
    void calc_gradient_test(const double *train_x, const double *train_y,
                            double *temp_step, double *theta) {
    
        //对每个参数分别子梯度
        for (int i = 0; i < g_param_count; i++) {
            double sum = 0;
            //用一个bachsize的平均梯度表示当前参数的梯度(temp_step[i])
            for (int j = 0; j < g_data_len; j++) {
                double hx = 0;
                for (int k = 0; k < g_param_count; k++) {
                    hx += theta[k] * (*(train_x+j*g_param_count+k));
                }
                sum += (hx - train_y[j]) * (*(train_x+j*g_param_count+i));
            }
            temp_step[i] = sum / g_data_len * 0.01;
        }
        printf("--------------------\n");
        train_step_test(temp_step, theta);
    }
    
    // 开始训练 (次数迭代60000次)
    void fit_test(double *X_pt,double *Y_pt) {
        for (int i = 0; i < 60000; ++i) {
            printf("\nstep %d: \n", i);
            calc_gradient_test(X_pt,Y_pt,temp,g_theta_pt);
            loss_val = loss_test(X_pt,Y_pt,g_theta_pt,loss_val);
        }
    }

    main.c :

    #include "src/MultipleLinearRegressionTest.h"
    
    int main() {
    
    
    
        //该数据由 Y=              4*X1 + 9*X2 + 10*X3 + 2*X4 + 1*X5 + 6 产生(数据中尚为加入噪声)
        //数据总的第一列都设置为1,是为了表示截距(Y=WX+B)的参数
        double X_pt[10][6] = {{1, 7.41,  3.98,  8.34,   8.0,    0.95},
                              {1, 6.26,  5.12,  9.57,   0.3,    7.79},
                              {1, 1.52,  1.95,  4.01,   7.96,   2.19},
                              {1, 1.91,  8.58,  6.64,   2.99,   2.18},
                              {1, 2.2,   6.88,  0.88,   0.5,    9.74},
                              {1, 5.17,  0.14,  4.09,   9.0,    2.63},
                              {1, 9.13,  5.54,  6.36,   9.98,   5.27},
                              {1, 1.17,  4.67,  9.02,   5.14,   3.46},
                              {1, 3.97,  6.72,  6.12,   9.42,   1.43},
                              {1, 0.27,  3.16,  7.07,   0.28,   1.77}};
    
        double Y_pt[10] = {171.81, 181.21, 87.84, 165.42, 96.26, 89.47, 181.21, 156.65, 163.83, 108.55};
        double pred_pt[10] ={1,2,3,4,5,6,7,8,9,0};
    
        // 参数
        double theta_pt[6] = {1.0,1.0,1.0,1.0,1.0,2.0};
        //临时变量
        double temp_pt[6] =  {1.0,1.0,1.0,1.0,1.0,2.0};
        // 学习率(次数我们还是指定为一个固定值)
        double learning_rate = 0.02;
    
        // 样本个数
        int data_len = 10;
        // 参数个数
        int param_count = 6;
        //通道数
        int channel = 1;
    
    
        init_test(learning_rate, data_len,param_count,channel,pred_pt,theta_pt,temp_pt);
    
        fit_test((double *) X_pt, Y_pt);
    
        return 0;
    }
    

    以上便是线性归回模型梯度下降求解的代码实现。各位大侠如有疑问或者问题欢迎交流。

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 今天我们用C语言实现一个简单的线性回归算法;在代码前面我们在回顾一下线性回归。 线性回归是回归问题中的一种,线性回归假设目标值与特征是线性相关的,即满足一个多元一次方程式。通过构建损失函数,来求解损失...

    今天我们用C语言实现一个简单的线性回归算法;在代码前面我们在回顾一下线性回归。

    线性回归是回归问题中的一种,线性回归假设目标值与特征是线性相关的,即满足一个多元一次方程式。通过构建损失函数,来求解损失函数最小时的参数W和b。通常表达式可以表示如下:

                                                                          y = WX + b

    其中 y 为预测值,自变量X和因变量y是已知的,我们要想实现的是,当一个新增的X出现时,我们要预测y的值。因此我们构建这个函数关系,是通过已知的数据求解函数模型中位置的W和b这两个参数。

         我们用均方误差为损失函数即:

    将函数带入即为:

    我们现在的任务就是求解最小化  L 时的W 和b,即将核心目标优化为

     

    此处我们用梯度下降法进行求解

    为了求偏导数,当只有一个样本时,即: 

    我们这里就简单的处理为求解,至于计算何时结束我们先不做考虑,就简单粗暴给其设定计算次数。

    理解了最小误差的求解原理我们就开始上代码了。

     

    LinerRegression.h

    #ifndef LINERREGRESSION_LINERREGRESSION_H
    #define LINERREGRESSION_LINERREGRESSION_H
    
    //初始化函数
    
    void set_config(double learning_rate,long int max_iter,int X_Len);
    //训练
    void fit(double *train_x,double *train_y);
    //计算
    
    double* _f(const double *train_x,double w,double b);
    
    //预测
    double* predict(double *train_x);
    //损失
    
    double loss(const double *y_true,const double *y_pred);
    //求梯度
    
    void _calc_gradient();
    //单步更新
    void _train_step();
    
    #endif 

    LinerRegression.c

    
    #include <stdio.h>
    #include <stddef.h>
    #include <malloc.h>
    #include "LinerRegression.h"
    
    
    //设置固定学习率
    double g_learning_rate = 0.01;
    //设置梯度更新次数
    long int g_max_iter = 100;
    //设置初始化 W
    double g_w = 5;
    //设置初始化 b
    double g_b = 5;
    //定义保存损失的指针
    double *loss_arr_pt;
    //定义保存时时计算y的指针
    double *g_out_Y_pt;
    //定义保存时时预测y的指针
    double *y_pred_pt;
    
    //输入 X 
    double *X_pt;
    //输入 Y
    double *Y_pt;
    //训练数据长度
    int g_X_Len;
    
    //更新 梯度
    double d_w;
    double d_b;
    
    double loss_val[1];
    
    void set_config(double learning_rate, long int max_iter, int X_Len) {
        g_learning_rate = learning_rate;
        g_max_iter = max_iter;
    //    g_w = gaussrand();
    //    g_b = gaussrand();
        g_X_Len = X_Len;
        loss_arr_pt = malloc((size_t) max_iter);
        g_out_Y_pt = malloc((size_t) X_Len);
        y_pred_pt = malloc((size_t) X_Len);
    }
    
    
    void fit(double *train_x, double *train_y) {
        X_pt = train_x;
        Y_pt = train_y;
        for (int i = 0; i < g_max_iter; ++i) {
            printf("step %d: ", i);
            _train_step();
            loss(NULL, NULL);
            loss_arr_pt[i] = loss_val[0];
        }
    }
    
    double *_f(const double *train_x, double w, double b) {
        for (int i = 0; i < g_X_Len; i++) {
            //y = w * x + b
            g_out_Y_pt[i] = train_x[i] * w + b;
        }
        return g_out_Y_pt;
    }
    
    //预测
    double *predict(double *train_x) {
        if (train_x == NULL) {
            train_x = X_pt;
        }
        y_pred_pt = _f(train_x, g_w, g_b);
        return y_pred_pt;
    }
    
    //计算损失
    double loss(const double *y_true, const double *y_pred) {
        if (y_true == NULL || y_pred == NULL) {
            y_true = Y_pt;
            y_pred = predict(X_pt);
        }
        double loss_total = 0;
        for (int i = 0; i < g_X_Len; i++) {
            loss_total += (y_true[i] - y_pred[i]) * (y_true[i] - y_pred[i]);
        }
        loss_val[0] = loss_total / g_X_Len;
        return loss_val[0];
    }
    
    //求梯度
    void _calc_gradient() {
        double d_w_total = 0;
        double d_b_total = 0;
        for (int i = 0; i < g_X_Len; i++) {
            //迭代计算梯度
            d_w_total += ((X_pt[i] * g_w + g_b - Y_pt[i]) * X_pt[i]);
            d_b_total += (X_pt[i] * g_w + g_b - Y_pt[i]);
        }
        d_w = d_w_total / g_X_Len;
        d_b = d_b_total / g_X_Len;
    }
    
    //更新 W 和 b
    void _train_step() {
        _calc_gradient();
        //更新 W和b
        g_w = g_w - g_learning_rate * d_w;
        g_b = g_b - g_learning_rate * d_b;
    
        //输出时时 W 和b 以及损失
        printf(" g_w = %f,", g_w);
        printf("g_b = %f,", g_b);
        printf(" loss = %f\n", loss_val[0]);
    
    }
    

     

    main.c

    
    #include "utils/util.h"
    
    #include "src/MultipleLinearRegression.h"
    #include "src/LinerRegression.h"
    
    int main() {
        //指定学习率
        double learning_rate = 0.01;
        //指定梯度下降计算次数
        int iteration_count = 2000;
    
        //生成输入变量的参数k、b; y = kx + b
        double k = 20.0;
        double b = 15;
    
        //训练数据大小
        int data_size = 100;
        int train_size = 70;
        int test_size = 30;
    
        double temp_rand[data_size];
        double X_data[data_size];
        double Y_data[data_size];
        double train_X[train_size];
        double train_Y[train_size];
        double test_X[test_size];
        double test_Y[test_size];
        //随机获取 输入变量X
        getRand(X_data, data_size);
        for (int i = 0; i < data_size; ++i) {
            getRand(temp_rand, data_size);
            Y_data[i] = k * X_data[i] + b + temp_rand[i] / 10;
        }
        for (int j = 0; j < data_size; ++j) {
            if (j < train_size) {
                train_X[j] = X_data[j];
                train_Y[j] = Y_data[j];
            } else {
                test_X[j - train_size] = X_data[j];
                test_Y[j - train_size] = Y_data[j];
            }
        }
    
        set_config(learning_rate, iteration_count, train_size);
        fit(train_X, train_Y);
    

    其中用到生成随机输入变量方法如下:

    int* getRand(double *a,int len){
        int i;
        srand(time(NULL));//设置当前时间为种子
        for (i = 0; i < len; ++i){
            a[i] = rand()%10+1;//产生1~10的随机数
        }
        return a;
    }
    

    可以看到在计算1000之后 W 和 b已经很接近我们初时设置的值了:

    step 989:  g_w = 20.235078,g_b = 14.003770, loss = 0.210872
    step 990:  g_w = 20.234798,g_b = 14.005839, loss = 0.209997
    step 991:  g_w = 20.234518,g_b = 14.007905, loss = 0.209125
    step 992:  g_w = 20.234238,g_b = 14.009966, loss = 0.208257
    step 993:  g_w = 20.233959,g_b = 14.012023, loss = 0.207393
    step 994:  g_w = 20.233681,g_b = 14.014076, loss = 0.206532
    step 995:  g_w = 20.233403,g_b = 14.016124, loss = 0.205674
    step 996:  g_w = 20.233126,g_b = 14.018169, loss = 0.204821
    step 997:  g_w = 20.232849,g_b = 14.020209, loss = 0.203970
    step 998:  g_w = 20.232573,g_b = 14.022244, loss = 0.203124
    step 999:  g_w = 20.232298,g_b = 14.024276, loss = 0.202281

     

    至此我们简单的一元线性回归就这样实现了。至于学习率更优雅的指定和学习停止条件我们后面再讨论。

    展开全文
  • 线性回归 c语言实现Linear regression models the relation between an explanatory (independent) variable and a scalar response (dependent) variable by fitting a linear equation. 线性回归通过拟合线性方程...
  • **线性回归(Linear Regression)**是一种通过属性的线性组合来进行预测的线性模型,其目的是找到一条直线或者一个平面或者更高维的超平面,使得预测值与真实值之间的误差最小化。 2.特点 优点:结果具有很好的可...
  • 多元线性回归完美C语言模型

    热门讨论 2009-12-08 11:33:50
    这是一个完美的任意元线性回归模型,使用c语言编写,采用初等变换实现,使用非常方便,只有2个函数,只要把要用到的函数拷到你的程序中即可。里面还附上逆阵的测试程序方便你验证,源文件使用.cpp或记事本打开
  • 多元线性回归C语言

    2020-11-24 23:43:28
    上篇已经介绍过简单线性回归了,这篇介绍第二个算法,多元线性回归,仅介绍两个主要函数:预测函数和训练函数。 算法介绍 模型可以如下表示: y=b0+b1×x1+b2×x2+... y = b_0+b_1×x_1+b_2×x_2+... y=b0​+b1​×...
  • 简单线性回归C语言

    2020-11-24 23:40:00
    简单线性回归应该是最简单的机器学习算法了,在这里主要介绍一下算法主要函数的C语言实现,具体算法原理简单一提,如果要学习,可以自行百度。 算法介绍 模型可以如下表示: y=b0+b1×x y = b_0 + b_1 × x y=b0​...
  • 针对线性最小二乘法即直线拟合,如下图(来自维基百科)所示: 透过这张图,我想大家一定能理解,我们用最小二乘法来做什么事情,即: 根据已有的数据(图中的点),来做出一条最贴近数据发展趋势的直线。...
  • 单变量线性回归 线性回归,就是能够用一个直线较为精确地描述数据之间的关系。这样当出现新的数据的时候,就能够预测出一个简单的值。线性回归中最常见的就是房价的问题。一直存在很多房屋面积和房价的数据,如下图...
  • 机器学习算法-线性回归

    千次阅读 2018-10-08 13:50:11
    机器学习笔记-线性回归一. 理论基础1.1 凸函数1.2 线性1.3 极大似然估计二. 线性回归模型(目标函数)2.1 线性回归定义2.2 线性回归模型三. 损失函数求解3.1 定义损失函数的方法3.1.1 最小二乘法3.1.2 极大似然法3.2...
  • 本文讲梯度下降(Gradient Descent)前先看看利用梯度下降法进行监督学习(例如分类、回归等)的一般步骤: 1, 定义损失函数(Loss Function) 2, 信息流forward propagation,直到输出端 3, 误差信号back ...
  • 线性最小二乘法C语言代码

    热门讨论 2011-10-10 21:09:01
    线性最小二乘法C语言代码 main () { int n,i,flag2; char flag1='y'; float ar[50],br[50],x,y,xe,ye,xye,xxe,sx,sy,sxy,sxx,a,b; printf ("\n欢迎使用最小二乘法数据处理程序\n");
  • 博主前面一篇文章讲述了二维线性回归问题的求解原理和推导过程,以及使用python自己实现算法,但是那种方法只能适用于普通的二维平面问题,今天博主来讲一下线性回归问题中更为通用的方法,也是我们实际开发中会经常...
  • 最近发现线性回归算法真是个好东西,通过它可以来分析过去一段数据的变化趋势、斜率,本贴分享亲测可用代码块,供需要的小伙伴参考。 1、C语言模块代码: /******************************************************...
  • 1、arrayX:坐标点X集合的指针 2、arrayY:坐标点Y集合的指针 3、len:坐标点的个数 输出参数: 1、retFactor:返回的线性回归函数的系数 2、retConstant:返回的线性回归函数的截距 返 回 值: ==0:失败,因为输入...
  • #include <stdio.h> #include <stdlib.h> #define DATA_PAIR 6 int main() { float X[6]={0}; float Y[6]={0}; float b,k,mxy,xx,yy,x2,x22; int i ; b = k = mxy = xx =yy =x2 =x22 =0.0;... printf(
  • C语言实现线性回归求斜率

    千次阅读 2020-11-01 14:17:01
    /* *****注意数据类型 *参数 count 数据个数 数组行(列)的个数 数组的行列数目相等 *参数 dataCol_X[count] 数据的列数据 *参数 dataRow_Y[count] 数据的行数据 *返回值 k 斜率 *使用注意 需要重定义数据类型 ...
  • 二元一次线性回归分析

    热门讨论 2009-03-15 23:29:08
    简单易用的小程序——不超过550KB——轻松解决二元一次的线性数据拟合问题 按照提示输入数据即可迅速得到所求的最优线性方程!
  • 3.选取维度个数,根据相关系数大小以及维度个数确定多元线性回归的自变量。 4.运用高斯亚当消元方法辅助矩阵求解系数向量,最终得到多元线性回归方程。 源代码 #include<stdio.h> #include<stdlib.h> #...
  • c语言写的线性 回归分析方程和时间趋势分析方程,函数形式,源码下载
  • 偏最小二乘回归:当数据量小,甚至比变量维数还小,而相关性又比较大时使用,这个方法甚至优于主成分回归
  • 不想吐槽这本书了,很奇葩的处理逻辑,很多细节都没照顾到。 代码如下: import numpy as np import matplotlib.pyplot as plt #数据 一行50个的等差序列 x = np.arange(0.,10.,0.2) #m为数据规模 50个 ...
  • void LET(double **CoefficientMatrix, double *ConstantMatrix, int m, /*系数矩阵为m行n列*/ int n, /*常数矩阵为1行n列*/ ...第五个参数为返回结果,即所求线性回归方程的系数,从b0-bm共m+1个
  • 本文主要采用Logistic...采用了C语言实现,可以看到所有代码 1. 输出y = w0+w1*x1+w2*x2+..... (x1,x2,...是样本的属性值,为连续型的变量,w0,w1,w2,...为所要求的参数,y为有限的数值型变量,表示样本所属类别)。
  • 1.1 SGB/BGD 比如对一个线性回归(Linear Logistics)模型,假设下面的h(x)是要拟合的函数, 为损失函数,theta是参数,要迭代求解的值,theta求解出来了那最终要拟合的函数 就出来了。其中m是训练集的样本个数,n...
  • 一、多元线性回归函数;二、使用梯度下降法处理多元线性回归函数;三、特征缩放;四、学习率α;五、特征和多项式回归;六、正规方程
  • 1、面向一维插值和线性拟合,含有牛顿插值、线性插值等四种插值方式; 2、设计了可用鼠标直接操作的GUI界面

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,344
精华内容 937
关键字:

线性回归算法c语言

c语言 订阅