机器学习算法(二):1 逻辑回归的从零实现(普通实现+多项式特征实现非线性分类+正则化实现三个版本)


前言

今天我们开始介绍逻辑回归的从零开始实现代码了,其中内容会包括普通实现、多项式特征实现非线性分类、正则化实现三个版本。相信看完底层实现你对逻辑回归的理解也会上升一个层次。

一、普通实现

1 数据集准备

在训练的初始阶段,我们将要构建一个逻辑回归模型来预测,某个学生是否被大学录取。设想你是大学相关部分的管理者,想通过申请学生两次测试的评分,来决定他们是否被录取。现在你拥有之前申请学生的可以用于训练逻辑回归的训练样本集。对于每一个训练样本,你有他们两次测试的评分和最后是被录取的结果。为了完成这个预测任务,我们准备构建一个可以基于两次测试评分来评估录取可能性的分类模型。
让我们从检查数据开始。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

path = 'ex2data1.txt'
data = pd.read_csv(path, header=None, names=['Exam 1', 'Exam 2', 'Admitted'])
data.head()

输出:
在这里插入图片描述

# 可视化一下该二分类数据
fig, ax = plt.subplots(1,1,figsize=(4,3))
ax.scatter(data[data['Admitted']==1]['Exam 1'], data[data['Admitted']==1]['Exam 2'], color = 'lightgreen', marker='o', label='Admitted')
ax.scatter(data[data['Admitted']==0]['Exam 1'], data[data['Admitted']==0]['Exam 2'], color = 'red', marker='x', label='Not Admitted')

plt.xlabel('Exam 1 Score')
plt.ylabel('Exam 2 Score')
plt.legend(loc='upper right')
plt.grid(True)
plt.show()

输出:
在这里插入图片描述
看起来在两类间,有一个清晰的决策边界。现在我们需要实现逻辑回归,那样就可以训练一个模型来预测结果。

# 数据准备
X_train = data.iloc[:,0:2].values   # X_train是一个(m,n)的矩阵,m是样本数,n是特征数
y_train = data.iloc[:,2].values     # y_train是一个(m,)的向量
print(f"X_train: {
     X_train}")
print(f"y_train: {
     y_train}")

输出:
在这里插入图片描述

2 逻辑回归模型

f w , b ( x ) = g ( w ⋅ x + b ) f_{\mathbf{w},b}(x) = g(\mathbf{w}\cdot \mathbf{x} + b) fw,b(x)=g(wx+b)

g ( z ) = 1 1 + e − z g(z) = \frac{1}{1+e^{-z}} g(z)=1+ez1

回忆逻辑回归模型,最外层是一个sigmoid函数,因此我们需要先实现sigmoid函数。

def sigmoid(z):
    return 1 / (1 + np.exp(-z))
# 可视化一下sigmoid函数
nums = np.arange(-10, 10, step=1)
fig, ax = plt.subplots(1,1,figsize=(4,3))
ax.plot(nums, sigmoid(nums), color='lightgreen')
plt.grid(True)
plt.show()

输出:
在这里插入图片描述
模型实现了,接下来我们需要实现损失函数,以及梯度下降算法。

3 损失函数

l o s s ( f w , b ( x ( i ) ) , y ( i ) ) = ( − y ( i ) log ⁡ ( f w , b ( x ( i ) ) ) − ( 1 − y ( i ) ) log ⁡ ( 1 − f w , b ( x ( i ) ) ) (2) loss(f_{\mathbf{w},b}(\mathbf{x}^{(i)}), y^{(i)}) = (-y^{(i)} \log\left(f_{\mathbf{w},b}\left( \mathbf{x}^{(i)} \right) \right) - \left( 1 - y^{(i)}\right) \log \left( 1 - f_{\mathbf{w},b}\left( \mathbf{x}^{(i)} \right) \right) \tag{2} loss(fw,b(x(i)),y(i))=(y(i)log(fw,b(x(i)))(1y(i))log(1fw,b(x(i)))(2)

  • f w , b ( x ( i ) ) f_{\mathbf{w},b}(\mathbf{x}^{(i)}) fw,b(x(i)) is the model’s prediction, while y ( i ) y^{(i)} y(i), which is the actual label

  • f w , b ( x ( i ) ) = g ( w ⋅ x ( i ) + b ) f_{\mathbf{w},b}(\mathbf{x}^{(i)}) = g(\mathbf{w} \cdot \mathbf{x^{(i)}} + b) fw,b(x(i))=g(wx(i)+b) where function g g g is the sigmoid function.

    • It might be helpful to first calculate an intermediate variable z w , b ( x ( i ) ) = w ⋅ x ( i ) + b = w 0 x 0 ( i ) + . . . + w n − 1 x n − 1 ( i ) + b z_{\mathbf{w},b}(\mathbf{x}^{(i)}) = \mathbf{w} \cdot \mathbf{x^{(i)}} + b = w_0x^{(i)}_0 + ... + w_{n-1}x^{(i)}_{n-1} + b zw,b(x(i))=wx(i)+b=w0x0(i)+...+wn1xn1(i)+b where n n n is the number of features, before calculating f w , b ( x ( i ) ) = g ( z w , b ( x ( i ) ) ) f_{\mathbf{w},b}(\mathbf{x}^{(i)}) = g(z_{\mathbf{w},b}(\mathbf{x}^{(i)})) fw,b(x(i))=g(zw,b(x(i)))
      *
      J ( θ ) = 1 m ∑ i = 1 m [ − y ( i ) log ⁡ ( h θ ( x ( i ) ) ) − ( 1 − y ( i ) ) log ⁡ ( 1 − h θ ( x ( i ) ) ) ] J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{[-{ {y}^{(i)}}\log \left( { {h}_{\theta }}\left( { {x}^{(i)}} \right) \right)-\left( 1-{ {y}^{(i)}} \right)\log \left( 1-{ {h}_{\theta }}\left( { {x}^{(i)}} \right) \right)]} J(θ)=m1i=1m[y(i)log(hθ(x(i)))(1y(i))log(1hθ(x(i)))]
def compute_cost_logistic(X, y, w, b):
    <
  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SVM(Support Vector Machine,支持向量机)是一种常用的分类算法,使用C语言可以进行其实现。SVM的目标是寻找一个最优的超平面,将不同类别的数据分隔开来。 下面是一个简单的使用C语言实现SVM的伪代码: 1. 导入所需的头文件和函数库。 2. 定义需要的全局变量,如数据集、特征向量和相应的类别标签。 3. 实现数据的预处理,包括数据读取、标准化等。 4. 实现SVM的训练过程: a. 初始化超平面的参数向量和偏置项。 b. 遍历样本数据集,计算每个样本点到超平面的距离,并根据分类准则进行分类。 c. 更新超平面的参数向量和偏置项,使分类准确率最高。 d. 迭代以上过程,直到满足停止条件。 5. 实现SVM的预测过程: a. 计算测试样本点到超平面的距离,根据分类准则进行分类。 b. 返回预测的类别标签。 6. 编写主函数,调用训练函数和预测函数,输出结果。 需要注意的是,SVM算法实现较为复杂,需要考虑到许多因素,如核函数的选择、拉格朗日乘子的计算等。除了手动实现,也可以使用机器学习库如LIBSVM、scikit-learn等进行SVM算法实现。 ### 回答2: 支持向量机(Support Vector Machine,SVM)是一种常用的分类算法,能够进行线性和非线性分类任务。它的核心思想是通过构建最优的超平面,将不同类别的样本分开。 SVM的C语言实现主要包括以下几个步骤: 1. 数据预处理:首先需要加载数据集,并对数据进行预处理,如归一化或标准化,使得数据在同一尺度上。 2. 计算核函数:对于非线性问题,SVM需要通过核函数将数据映射到高维特征空间。常用的核函数有线性核、多项式核和高斯核等。 3. 计算损失函数:SVM通过最小化损失函数来训练模型。常用的损失函数是hinge损失,可以使用梯度下降等优化算法进行求解。 4. 模型训练:利用训练数据集,通过求解最优化问题,得到模型的参数和支持向量。 5. 模型预测:根据得到的模型参数和支持向量,对新的样本进行预测,判断其属于哪个类别。 在C语言中,可以使用矩阵运算库(如BLAS、LAPACK)来加速运算过程,以提高算法的效率。 总结起来,SVM分类算法的C语言实现由数据预处理、计算核函数、计算损失函数、模型训练和模型预测等步骤组成。在实际应用中,可以根据具体需求选择不同的核函数和优化算法,来构建和训练SVM模型。SVM在文本分类、图像识别、生物信息学等领域有着广泛的应用。 ### 回答3: 支持向量机(Support Vector Machine,SVM)是一种常用的机器学习算法,主要用于数据分类和回归分析。SVM通过寻找一个最优超平面将数据集划分成不同的类别。 在C语言中实现SVM分类算法,首先需要理解SVM的原理和算法步骤。使用C语言可以通过结构体和数组来表示数据集和向量等对象,也可以利用循环和条件判断等语句实现算法的各个步骤。 一种常见的SVM分类算法实现步骤如下: 1. 数据预处理:读取训练数据集,分离出特征向量和标签,对数据进行归一化处理。 2. 定义和初始化模型参数:包括权重向量w、偏置b和学习率等。 3. 计算目标函数:根据SVM的目标函数和约束条件,计算损失函数和正则化项。 4. 参数更新:使用梯度下降法或其他优化算法,更新模型参数w和b。 5. 训练模型:迭代地重复步骤3和步骤4,直到达到收敛条件。 6. 预测分类:使用训练得到的模型对新的数据进行分类预测。 在C语言中实现SVM分类算法,可以按照上述步骤编写相应的函数和代码。具体实现中,可能需要用到矩阵计算库、数值计算库或者线性代数库等工具,来方便地处理向量运算、矩阵运算和优化算法等。 总之,SVM算法的C语言实现主要涉及数据预处理、模型参数更新和分类预测等步骤,通过合理的数据表示和算法实现,可以有效地实现SVM分类算法并应用于实际问题中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值