实验目的
- 对比理解梯度下降和批量随机梯度下降的区别与联系。
- 对比理解逻辑回归和线性分类的区别与联系。
- 进一步理解SVM的原理并在较大数据上实践。
实验数据
实验使用的是LIBSVM Data的中的a9a数据,包含32561 / 16281(testing)个样本,每个样本有123/123 (testing)个属性。请自行下载训练集和验证集。在读取数据时可能会出现维度不对的问题,是因为数据最后列全为零而被忽略,可以在下载的数据集文件后面自行添加后再读取,也可在读取数据集时指定n_features=123来解决。
实验步骤
逻辑回归与批量随机梯度下降
- 读取实验训练集和验证集。
- 逻辑回归模型参数初始化(可以考虑全零初始化,随机初始化或者正态分布初始化)。
- 选择Loss函数及对其求导,过程详见课件ppt。
- 自行确定batch_size大小,随机取出部分样本,求得部分样本对Loss函数的梯度 。
- 使用SGD优化方法更新参数模型,鼓励额外尝试Adam优化方法。
- 选择合适的阈值,将验证集中计算结果大于阈值的标记为正类,反之为负类。在验证集上测试并得到Loss函数值 Lvalidation 。
- 重复步骤4-6若干次,画出 Lvalidation 随迭代次数的变化图。
线性分类与批量随机梯度下降
- 读取实验训练集和验证集。
- 支持向量机模型参数初始化(可以考虑全零初始化,随机初始化或者正态分布初始化)。
- 选择Loss函数并对其求导,过程详见课件ppt。
- 自行确定batch_size大小,随机取出部分样本,求得部分样本对Loss函数的梯度 。
- 使用SGD优化方法更新参数模型,鼓励额外尝试Adam优化方法。
- 选择合适的阈值,将验证集中计算结果大于阈值的标记为正类,反之为负类。在验证集上测试并得到Loss函数值 Lvalidation 。
- 重复步骤4-6若干次,画出 Lvalidation 随迭代次数的变化图。
示例代码
导入依赖
1 | import numpy as np |
读取数据集
1 | # 读取实验训练集和验证集 |
1 | # 将数据集切分为训练集和验证集 |
1 | # 将稀疏矩阵转为ndarray类型 |
1 | X_train = np.concatenate((np.ones((X_train.shape[0],1)), X_train), axis = 1) |
1 | X_train.shape, X_valid.shape, y_train.shape, y_valid.shape |
逻辑回归
定义sigmoid函数
1 | def sigmoid(z): |
定义logistic loss函数
1 | def logistic_loss(X, y ,theta): |
计算当前loss
1 | theta = np.zeros((X_train.shape[1],1)) |
定义logistic gradient函数
1 | def logistic_gradient(X, y, theta): |
定义logistic score函数
1 | def logistic_score(X, y, theta): |
定义logistic decent函数
1 | def logistic_descent(X, y, theta, alpha, num_iters, batch_size, X_valid, y_valid): |
执行梯度下降
1 | theta = np.zeros((X_train.shape[1],1)) |
1 | logistic_score(X_valid, y_valid, opt_theta) |
1 | iteration = np.arange(0, num_iters, step = 1) |
SVM
定义hinge loss函数
1 | def hinge_loss(X, y, theta, C): |
计算当前loss
1 | theta = np.random.random((X_train.shape[1],1)) |
定义hinge gradient函数
1 | def hinge_gradient(X, y, theta, C): |
定义svm decent函数
1 | def svm_descent(X, y, theta, alpha, num_iters, batch_size, X_valid, y_valid, C): |
定义svm score函数
1 | def svm_score(X, y, theta): |
执行梯度下降
1 | theta = np.random.random((X_train.shape[1],1)) |
1 | svm_score(X_valid, y_valid, opt_theta) |
1 | iteration = np.arange(0, num_iters, step = 1) |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment