使用C++的机器学习简介

158 阅读6分钟

使用C++的机器学习简介

C++是一种高级面向对象的编程语言,与大多数编程语言相比,它的运行时间更快。这是因为它更接近于机器语言。由于Python的灵活性和丰富的库支持以及活跃的用户社区,最近在机器学习和其他人工智能相关方面的进展都是用Python实现的。

与其他编程语言相比,C++的运行时间更快,因此适用于机器学习,因为快速和可靠的反馈在机器学习中至关重要。

C++也有丰富的库支持,在机器学习中使用,这一点我们将在后面讨论。

目标

本教程的目标是让你了解如何使用C++编程语言实现机器学习算法。由于这是一个介绍性的部分,我们将从头开始实现这些算法以促进理解。之后,当我们开始使用库时就会更容易。

前提条件

要轻松地学习本教程,应该满足以下要求。

  • 对C++编程和使用对象来存储大数据有基本了解。
  • 一个预装的IDE,最好是Codeblocks
  • 有良好的数学背景,以便理解后面要使用的统计方法。

机器学习的定义

机器学习是人工智能的一个方面。它指的是计算机系统通过识别存储在数据库中的数据模式来独立寻找问题解决方案的能力。人类需要编写计算机系统使用的算法,收集数据,并将其放入数据集。之后,机器会独立学习并能找到解决方案。

在C++中实现机器学习的统计和数学方法

在我们开始写代码之前,我们需要了解要使用的方法。我们将使用一种数学方法,即线性回归,使我们的系统能够学习。

线性回归

在线性回归中,我们根据第二个变量的值来确定一个变量的值。因变量是我们试图计算其价值的变量,而自变量是帮助我们估计因变量价值的数值。

这可以用数学方法表示。

y=B0 + B1x

为了说明这一点,我们可以根据一个地区的温度,使用线性回归来确定该地区的降雨量。因变量成为收到的降雨量,而自变量是该地区的温度。

损失函数

我们预测的B0B1 的值的误差被称为损失。我们要使误差最小化,这样我们就能得到最准确的B0B1 的值。

这给我们提供了最佳拟合线,然后将用于更准确的预测。

e^i=p^i- y^i

其中。

  • e^i是第i个训练例子的误差。

  • p^i 是第 i 个训练实例的预测值。

  • y^i是第i个训练实例的真实/实际值。

梯度下降法的算法

梯度下降是一种重复的优化算法,在寻找一个函数的最小值时非常有用,在我们的例子中,损失函数。

让我们从B0B1 的初始化值开始,根据我们在每个实例中得到的误差,我们将更新它们的值。

情况是这样的。我们从B1 = 0和B0 = 0的值开始。L 将是学习的速度。它控制每一步B1 的变化程度。为了获得更大的准确性,L ,可以使其尽可能的小。例如,使用0.01 ,以获得良好的准确性。

继续计算第一点的误差,如下所示。e(1) = p(1) – y(1)

根据方程式更新B0B1 的值。

b0(t+1) = b0(t) - L * error
b1(t+1) = b1(t) - L * error

对每个训练集实例做此操作。这样一个历时就完成了。我们根据需要对更多的历时进行重复操作,以获得尽可能少的错误预测。

使用C++实现线性回归

让我们定义一下我们将在教程中使用的数据集。

我们将使用前5个值来训练我们的算法,并在最后一个值上测试它的性能。

double x[] = {1, 2, 3, 4, 5};
double y[] = {1, 3, 3, 2, 5};

接下来,我们将定义我们的变量。

vector<double>error; // for storing the error values
double devi;    // for calculating error on each stage,we name it devi(short for deviation) to differentiate it from the error vector
double b0 = 0; // initializing b0
double b1 = 0; // initializing b1
double learnRate = 0.01; // initializing our learning rate

训练阶段

接下来,我们将进行梯度下降算法的工作。

for (int i = 0; i < 20; i ++) {   // Since there are five values and four epochs are needed, run a for loop 20 times.
    int index = i % 5;   // for accessing index after every epoch
    double p = b0 + b1 * x[index];  // calculating prediction
    devi = p - y[index]; // calculating error. 
    b0 = b0 - learnRate * devi; // updating b0
    b1 = b1 - learnRate * devi * x[index];// updating b1
    cout<<"B0="<<b0<<" "<<"B1="<<b1<<" "<<"error="<<devi<<endl; // printing values after every update
    error.push_back(devi);
}

我们使用一个for循环,运行20次,因为我们正在处理5个值,整个算法运行了4个epochs。每个实例的期望值是通过变量p 。根据我们上面列出的误差方程,每个实例的误差被存储在变量devi

变量b0b1 ,然后使用梯度下降算法进行更新。误差被推送到error 向量中。

值得注意的是,B0 ,没有任何输入。它被称为偏置或y 截距,我们假设它有一个固定的输入值1.0。这个假设在实现算法时很有帮助,比如在使用数组或向量时。

在最终确定时,对误差向量进行排序,以获得error 的最低值,从而获得b0b1 的相应值。我们定义了一个自定义的排序函数来对error 向量进行排序。

我们将打印这些值。

sort(error.begin(),error.end(),custom_sort);// sorting to find the smallest value.
cout<<"Optimal end values are: "<<"B0="<<b0<<" "<<"B1="<<b1<<" "<<"error="<<error[0];

测试:

cout<<"Enter a test x value";
double test;
cin>>test;
double pred=b0+b1*test;
cout<<"The value predicted by the model= "<<pred;

为了测试我们的算法是否有效,我们输入6,这是我们的测试值。我们得到4.9753,四舍五入后大约等于5。

恭喜你!我们已经实现了线性回归模型。我们已经用C++实现了一个线性回归模型,并且有很好的参数。

下面是完整的代码,用于实现。

#include<bits/stdc++.h>  // This header file contains all C++ libraries
using namespace std;   // stdout library for printing values 
bool custom_sort(double a, double b) /* this custom sort function sorts based on the minimum absolute value */
{
    double a1=abs(a-0);
    double b1=abs(b-0);
    return a1<b1;
}
int main()
{
/*Intialization Phase*/
double x[] = {1, 2, 3, 4, 5};    // defining x values
double y[] = {1, 3, 3, 2, 5};    // defining y values
vector<double>error;             // array to store all error values
double devi;
double b0 = 0;                   //initializing b0
double b1 = 0;                   //initializing b1
double learnRate = 0.01;             //initializing error rate
 
/*Training Phase*/
for (int i = 0; i < 20; i ++) {   // Since there are five values and four epochs are needed, run a for loop 20 times.
    int index = i % 5;              // This accesses the index after each epoch
    double p = b0 + b1 * x[index];  // calculating prediction
    devi = p - y[index];              // calculating error
    b0 = b0 - learnRate * devi;         // updating b0
    b1 = b1 - learnRate * devi * x[index];// updating b1
    cout<<"B0="<<b0<<" "<<"B1="<<b1<<" "<<"error="<<devi<<endl;// printing values after every update
    error.push_back(devi);
}
sort(error.begin(),error.end(),custom_sort); // error values used to sort the data
cout<<"Optimal end values are: "<<"B0="<<b0<<" "<<"B1="<<b1<<" "<<"error="<<error[0]<<endl;

/*Testing Phase*/
cout<<"Enter a test x value";
double test;
cin>>test;
double pred=b0+b1*test;
cout<<endl;
cout<<"The value predicted by the model= "<<pred;
}

结论

对于涉足机器学习来说,C++是一种很好的编程语言。然而,由于这相对较新,你将不得不从头开始实现大部分的算法。

如果不了解机器学习算法的基础知识,就很难用C++实现机器学习。我想这就是为什么与C++相比,Python在机器学习方面更受欢迎。

C++支持机器学习的库也比较少。我们将在未来的文章中介绍这些库。

机器学习中的线性回归对预测很有用,因为该算法能够根据以前的模式进行预测。这使组织和机构能够根据预测情况制定出有利的战略。

机器学习还可以帮助小企业确定通过改变各种因素对其销售的影响。这确保他们开展的业务能够带来利润。

机器学习还可以减少人力成本,因为在给你提供可能容易出错的可行性报告之前,可能需要几天时间来分析数据。