介绍
在本练习中,您将实现逻辑回归并将其应用于两个不同的数据集。还将通过将正则化加入训练算法,来提高算法的鲁棒性,并用更复杂的情形来测试模型算法。
在开始练习前,需要下载如下的文件进行数据上传:
ex2data1.txt -前半部分的训练数据集
ex2data2.txt -后半部分的训练数据集
在整个练习中,涉及如下的必做作业:
· 绘制2D分类数据的函数----(3分)
· 实现Sigmoid函数--------(5分)
· 实现Logistic回归代价函数和梯度函数—(60分)
· 实现回归预测函数--------(5分)
· 实现正则Logisitic回归成本函数-------(27分)
1 Logistic回归
在该部分练习中,将建立一个逻辑回归模型,用以预测学生能否被大学录取。
假设你是大学某个部门的负责人,你要根据两次考试的结果来决定每个申请人的入学机会。目前已经有了以往申请者的历史数据,并且可以用作逻辑回归的训练集。对于每行数据,都包含对应申请者的两次考试分数和最终的录取结果。
在本次练习中,你需要建立一个分类模型,根据这两次的考试分数来预测申请者的录取结果。
1.1 数据可视化
在开始实施任何算法模型之前,最好先对数据进行可视化,这将会更加直观的获取数据特征。
现在,你需要编写代码来完成数据的绘图,显示如下所示的图形。
要点:
导入需要使用的python库,并将从文件ex2data1.txt中读取数据,并显示前5行
x-y轴分别为两次考试的分数
正负示例需要用不同的标记显示(不同的颜色)
###在这里填入代码###
###主要实现要点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()
1
2
3
4
5
6
7
8
9
Exam 1 Exam 2 Admitted
0 34.623660 78.024693 0
1 30.286711 43.894998 0
2 35.847409 72.902198 0
3 60.182599 86.308552 1
4 79.032736 75.344376 1
positive = data[data['Admitted'].isin([1])]
negative = data[data['Admitted'].isin([0])]
fig, ax = plt.subplots(figsize=(12,8))
正向类,绘制50个样本,c=‘b’颜色,maker=‘o’绘制的形状
ax.scatter(positive['Exam 1'], positive['Exam 2'], s=50, c='b', marker='o', label='Admitted')
ax.scatter(negative['Exam 1'], negative['Exam 2'], s=50, c='r', marker='x', label='Not Admitted')
ax.legend()# Legend 图例,获取label标签内容,如图右上角显示
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1.2 实现
在前部分练习中所绘制的数据分布图中可以看出,在不同标识的数据点间,有一个较为清晰的决策边界。现在需要实现逻辑回归,并使用逻辑回归来训练模型用以预测分类结果。
1.2.1 Sigmoid函数
在正式开始之前,我们先来了解一个函数:Sigmoid函数。
我们还记得逻辑回归假设的定义是:
[{
{h}{\theta }}\left( x \right)=g\left({
{
{\theta }^{T}}X} \right)]
其中 g 代表一个常用的逻辑函数为S形函数(Sigmoid function),公式为:
g(z)=11+e−z
g(z)=11+e−z
合起来,我们得到逻辑回归模型的假设函数:
[{
{h}{\theta }}\left( x \right)=\frac{1}{1+{
{e}^{-{
{\theta }^{T}}X}}}]
接下来,你需要编写代码实现Sigmoid函数,编写后试着测试一些值,如果x的正值较大,则函数值应接近1;如果x的负值较大,则函数值应接近0。而对于x等于0时,则函数值为0.5。
确保在进行调用你实现的Sigmoid函数后,以下代码会输出如下的图片:
###在这里填入代码###
def sigmoid(z):
return 1.0 / (1.0 + np.exp(-z))
1
2
3
4
###请运行并测试你的代码###
nums = np.arange(-10, 10, step=1)
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(nums, sigmoid(nums), 'r')
plt.show()
1
2
3
4
5
6
7
1.2.2 代价函数和梯度
1.2.2.1 代价函数
现在,你需要编写代码实现代价函数以进行逻辑回归的成本计算,并且经过所给数据测试后,初始的成本约为0.693。
要点:
实现cost函数,参数为theta,X,y.
返回计算的成本值。
其中theta为参数,X为训练集中的特征列,y为训练集的标签列,三者均为矩阵。
###在这里填入代码###
def cost(theta,X,y):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
first = np.multiply(-y, np