C++实现机器学习算法

在当前的工业界,Python无疑是首选的编程语言,但许多人的背景并非如此。许多大学计算机科学系仍在教授C++编程,因此中的大多数人首先学习的是C++。理解为什么应该学习Python——它是工业界的主导语言,拥有所有启动机器学习所需的库。但如果大学不教授Python呢?这就是深入研究并使用C++构建机器学习算法的动机。因此,如果是大学生、行业新人,或者只是对学习不同的机器学习语言感兴趣,本教程适合!

线性回归使用C++

在使用C++实现线性回归之前,先简要了解一下线性回归是什么以及它的工作原理。线性回归模型用于根据另一个因素的值预测一个因素的值。被预测的值称为因变量,用于预测因变量的值称为自变量。线性回归的数学方程是:

Y = B0 + B1 * X

其中,X是自变量,Y是因变量,B0表示当X=0时Y的值,B1是回归系数(这表示因变量基于自变量单位变化的变化)。例如,可以使用线性回归来理解是否可以基于吸烟时长预测香烟消费量。在这里,因变量将是“香烟消费量”,以每天消耗的香烟数量来衡量,自变量将是“吸烟时长”,以天数来衡量。

损失是预测的B0和B1值的误差。目标是最小化这个误差,以获得B0和B1的最准确值,以便可以得到最佳拟合线进行未来预测。为了简单起见,将使用以下损失函数:

e(i) = p(i) - y(i)

其中,e(i)是第i个训练样本的误差,p(i)是第i个训练样本的预测值,y(i)是第i个训练样本的实际值。

梯度下降是一种迭代优化算法,用于找到函数的最小值。在本例中,该函数是损失函数。目标是找到损失函数的最小值(在例子中接近零)。梯度下降是一种有效的算法,可以实现这一点。从随机的系数B0和B1的初始值开始,根据每个实例上的错误,将更新它们的值。

以下是它的工作原理:最初,让B1 = 0和B0 = 0。让L成为学习率。这控制了B1的值每一步变化的量。L可能是一个像0.01这样的小值,以获得良好的准确性。计算第一个点的误差:e(1) = p(1) - y(1)。将根据以下方程更新B0和B1:

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

对训练集中的每个实例都这样做。这完成了一个周期。将重复这个过程进行更多的周期,以获得更准确的预测。

C++中实现线性回归

初始化阶段:首先定义数据集。对于本教程的范围,将使用这个数据集。将在前5个值上训练数据集,并在最后一个值上进行测试:

// 定义数据集代码

接下来,定义变量:

// 定义变量代码

训练阶段:下一步是梯度下降算法:

// 梯度下降算法代码

由于有5个值,运行整个算法4个周期,因此迭代函数工作了20次。变量p计算每个实例的预测值。变量err用于计算每个实例的误差。然后按照上面梯度下降部分中解释的更新b0和b1的值。最后,将误差推入误差向量。

正如将注意到的,B0没有任何输入。这个系数通常被称为偏差或截距,可以假设它始终有一个输入值1.0。这个假设可以帮助在使用向量或数组实现算法时。

最后,将对误差向量进行排序,以获得误差的最小值和相应的b0和b1值。最后,将打印这些值:

// 打印值代码

测试阶段:

// 测试阶段代码

将输入测试值6。得到的答案是4.9753,非常接近5。恭喜!刚刚用C++完成了线性回归模型的构建,而且参数也很好。

C++中的逻辑回归

逻辑回归是最著名的二元分类机器学习算法之一。这是因为它是一个简单的算法,可以在广泛的问题的上表现非常好。这个算法的名称是逻辑回归,因为在这个算法中使用了逻辑函数。这个逻辑函数定义为:

predicted = 1 / (1 + e^-x)

逻辑回归模型接受实数值输入,并预测输入属于默认类别(类别0)的概率。如果概率大于0.5,可以将输出作为默认类别(类别0)的预测,否则,预测是为另一个类别(类别1)。

可以将随机梯度下降应用于寻找逻辑回归模型系数的问题,如下所示:假设对于示例数据集,逻辑回归有三个系数,就像线性回归一样:

output = b0 + b1*x1 + b2*x2

学习算法的工作是发现基于训练数据的最佳系数值(b0、b1和b2)。给定每个训练实例:使用当前系数值计算预测。预测 = 1 / (1 + e^(-(b0 + b1*x1 + b2*x2))。根据预测中的误差计算新的系数值。值根据以下方程更新:

b = b + alpha * (y – prediction) * prediction * (1 – prediction) * x

其中b是正在更新的系数,预测是使用模型进行预测的输出。Alpha是必须在训练运行开始时指定的参数。这是学习率,控制每次更新时系数(因此模型)的变化或学习量。

就像之前讨论线性回归时看到的那样,B0没有任何输入。这个系数被称为偏差或截距,可以假设它始终有一个输入值1.0。因此,在更新时,将乘以1.0。这个过程一直重复,直到模型足够准确(例如,误差降低到某个期望的水平)或进行固定次数的迭代。

初始化阶段:首先定义数据集。将在前10个值上训练,并在最后一个值上进行测试:

// 定义数据集代码

接下来,初始化变量:

// 初始化变量代码

训练阶段:由于有10个值,将运行一个周期,这个周期需要10步。将根据上述梯度下降部分中描述的方程计算预测值:

prediction = 1 / (1 + e^(-(b0 + b1*x1 + b2*x2)))

接下来,将根据上述方程更新变量:

b = b + alpha * (y – prediction) * prediction * (1 – prediction) * x // 打印值代码 // 打印类别代码
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485