在当前的工业界,Python无疑是首选的编程语言,但许多人的背景并非如此。许多大学计算机科学系仍在教授C++编程,因此中的大多数人首先学习的是C++。理解为什么应该学习Python——它是工业界的主导语言,拥有所有启动机器学习所需的库。但如果大学不教授Python呢?这就是深入研究并使用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
对训练集中的每个实例都这样做。这完成了一个周期。将重复这个过程进行更多的周期,以获得更准确的预测。
初始化阶段:首先定义数据集。对于本教程的范围,将使用这个数据集。将在前5个值上训练数据集,并在最后一个值上进行测试:
// 定义数据集代码
接下来,定义变量:
// 定义变量代码
训练阶段:下一步是梯度下降算法:
// 梯度下降算法代码
由于有5个值,运行整个算法4个周期,因此迭代函数工作了20次。变量p计算每个实例的预测值。变量err用于计算每个实例的误差。然后按照上面梯度下降部分中解释的更新b0和b1的值。最后,将误差推入误差向量。
正如将注意到的,B0没有任何输入。这个系数通常被称为偏差或截距,可以假设它始终有一个输入值1.0。这个假设可以帮助在使用向量或数组实现算法时。
最后,将对误差向量进行排序,以获得误差的最小值和相应的b0和b1值。最后,将打印这些值:
// 打印值代码
测试阶段:
// 测试阶段代码
将输入测试值6。得到的答案是4.9753,非常接近5。恭喜!刚刚用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
// 打印值代码
// 打印类别代码