题目

在这部分的练习中,你将建立一个逻辑回归模型来预测一个学生是否能进入大学。假设你是一所大学的行政管理人员,你想根据两门考试的结果,来决定每个申请人是否被录取。你有以前申请人的历史数据,可以将其用作逻辑回归训练集。对于每一个训练样本,你有申请人两次测评的分数以及录取的结果。为了完成这个预测任务,我们准备构建一个可以基于两次测试评分来评估录取可能性的分类模型。

编程实现

1.Visualizing the data

在开始实现任何学习算法之前,如果可能的话,最好将数据可视化。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt data = pd.read_csv('D:\BaiduNetdiskDownload\data_sets\ex2data1.txt', names=['exam1', 'exam2', 'admitted'])
data.head()

# 把数据分成 positive 和 negetive 两类
positive = data[data.admitted.isin(['1'])] # admitted=1 为 positive 类
negetive = data[data.admitted.isin(['0'])] # admitted=0 为 negetive 类 fig, ax = plt.subplots(figsize=(8,7))
ax.scatter(positive['exam1'], positive['exam2'], c='b', label='Admitted')
ax.scatter(negetive['exam1'], negetive['exam2'], s=50, c='r', marker='x', label='Not Admitted') # s 设置点的大小;marker 设置画图的形状 #设置图例在右上角
# ax.legend(loc=1) # 设置图例显示在图的上方
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width , box.height* 0.8])
ax.legend(loc='center left', bbox_to_anchor=(0.2, 1.12),ncol=3) # 设置横纵坐标名
ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')
plt.show()



可以看到在两类间,有一个清晰的决策边界。现在我们需要实现逻辑回归,那样就可以训练一个模型来预测结果。

2.Sigmoid function

首先来回顾下 logistic 回归的假设函数:

\[h_{\theta}\left(x\right)=g\left( \theta^T x \right)=\frac{1}{1+e^{-\theta^T x } }
\]

令 \(\theta^T x = z\),其中,\(g(z)\) 被称为 Sigmoid function (S型函数)或 Logistic function:

\[g(z)=\frac{1}{1+e^{-z}}
\]

def sigmoid(z):
return 1 / (1 + np.exp(- z)) x1 = np.arange(-10, 10, 0.1)
plt.plot(x1, sigmoid(x1), c='r')
plt.show()

3.Cost function

逻辑回归的代价函数如下:

\[J(\theta)=\frac1m \sum_{i=1}^m \left( - y^{\left(i \right)} log \left( h_\theta \left( x^{\left( i\right)} \right) \right) - \left( 1-y^{\left( i\right)} \right) log \left( 1- h_\theta \left( x^{\left( i\right)} \right) \right) \right)
\]

\[h_{\theta}\left(x\right)=g\left( \theta^T x \right)
\]

# 定义代价函数(能够返回代价函数值)
def cost(theta, X, y):
first = (-y) * np.log(sigmoid(X @ theta)) # 注意这里的 theta 是列向量
second = (1 - y)*np.log(1 - sigmoid(X @ theta))
return np.mean(first - second)
# add a ones column - this makes the matrix multiplication work out easier
if 'Ones' not in data.columns:
data.insert(0, 'Ones', 1) # set X (training data) and y (target variable)
# 用.iloc来取列
X = data.iloc[:, :-1].values # Convert the frame to its Numpy-array representation.
y = data.iloc[:, -1].values # Return is NOT a Numpy-matrix, rather, a Numpy-array. theta = np.zeros(X.shape[1]) # X.shape[1]获取X的列数,这里theta是列向量

检查矩阵的维度:

X.shape, theta.shape, y.shape

计算代价函数的初始值:

cost(theta, X, y)

接下来,我们需要一个函数来计算我们的训练数据、标签和一些参数thate的梯度。

4.Gradient

计算梯度值:

\[\frac{\partial }{\partial \theta_j} J(\theta)=\frac1m \sum_{i=1}^m \left( h_\theta \left( x^{ \left(i\right) } \right) -y{ \left(i\right) } \right) x_{j}^{\left(i\right)}
\]

转化为向量化计算:

\[\frac1m X^T\left( sigmoid\left( X \theta \right)-y\right)
\]

在此题中 ,\(X\) 是100*3的矩阵, \(X^T\) 就是3*100的矩阵。\(\theta\) 是3*1的矩阵,则最后求得的梯度值是一个3*1的矩阵。

# 定义计算梯度值(导数值)
def gradient(theta, X, y):
return (X.T @ (sigmoid(X @ theta) - y))/len(X)
# the gradient of the cost is a vector of the same length as θ where the jth element (for j = 0, 1, . . . , n)

计算梯度值的初始数据:

gradient(theta, X, y)

注意,我们还没有在执行梯度下降算法,这里仅仅在计算梯度值。

5.Learning θ parameters

  • 在视频中,一个称为“fminunc”的Octave函数是用来优化函数来计算成本和梯度参数。
  • 由于我们使用Python,我们可以用SciPy的“optimize”命名空间来做同样的事情。

    这里我们使用的是高级优化算法,运行速度通常远远超过梯度下降。方便快捷。

    只需传入cost函数,已经所求的变量theta,和梯度。注意:cost函数定义变量时变量theta要放在第一个,若cost函数只返回cost,则设置fprime=gradient。
import scipy.optimize as opt

# 这里使用fimin_tnc方法来拟合
result = opt.fmin_tnc(func=cost, x0=theta, fprime=gradient, args=(X, y)) result

计算优化算法之后的代价值函数值:

cost(result[0], X, y)

6.Evaluating logistic regression

  • 学习好了参数\(θ\)后,我们来用这个模型预测某个学生是否能被录取。
  • 接下来,我们需要编写一个函数,用我们所学的参数\(\theta\)来为数据集\(X\)输出预测。然后,我们可以使用这个函数来给我们的分类器的训练精度打分。
  • 逻辑回归模型的假设函数:

\[h_{\theta}\left(x\right)=\frac{1}{1+e^{-\theta^T x } }
\]

  • 当\({h}_{\theta }\)大于等于0.5时,预测 y=1
  • 当\({h}_{\theta }\)小于0.5时,预测 y=0
def predict(theta, X):
probability = sigmoid(X @ theta)
return [1 if x >= 0.5 else 0 for x in probability] # return a list
final_theta = result[0]
predictions = predict(final_theta, X)
correct = [1 if a==b else 0 for (a, b) in zip(predictions, y)]
accuracy = sum(correct) / len(X)
accuracy

可以看到预测精度达到了89%。

7.Decision boundary(决策边界)

决策边界:

\[\theta^T x=0
\]

此题中决策边界为:

\[\theta_0+\theta_1x_1+\theta_2x_2=0
\]

x1 = np.arange(130, step=0.1)
x2 = -(final_theta[0] + x1*final_theta[1]) / final_theta[2] fig, ax = plt.subplots(figsize=(8,5))
ax.scatter(positive['exam1'], positive['exam2'], c='b', label='Admitted')
ax.scatter(negetive['exam1'], negetive['exam2'], s=50, c='r', marker='x', label='Not Admitted')
ax.plot(x1, x2)
ax.set_xlim(0, 130)
ax.set_ylim(0, 130)
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_title('Decision Boundary')
plt.show()

总结

逻辑回归的实现需要自己编写计算cost和gradient的函数,然后通过高级的优化算法就可以得到theta的最优解,不需要自己手动编写梯度下降函数。高级的优化算法不需要手动选择学习率α,收敛的速度远远快于梯度下降,但是要比梯度下降复杂。线性回归可以使用高级优化算法吗?明天试一下。

编程作业2.1:Logistic regression的更多相关文章

  1. Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2)及总结

    Exercise 1:Linear Regression---实现一个线性回归 关于如何实现一个线性回归,请参考:http://www.cnblogs.com/hapjin/p/6079012.htm ...

  2. Andrew Ng机器学习编程作业:Logistic Regression

    编程作业文件: machine-learning-ex2 1. Logistic Regression (逻辑回归) 有之前学生的数据,建立逻辑回归模型预测,根据两次考试结果预测一个学生是否有资格被大 ...

  3. ufldl学习笔记与编程作业:Logistic Regression(逻辑回归)

    ufldl学习笔记与编程作业:Logistic Regression(逻辑回归) ufldl出了新教程,感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量群里面听 ...

  4. 编程作业2.2:Regularized Logistic regression

    题目 在本部分的练习中,您将使用正则化的Logistic回归模型来预测一个制造工厂的微芯片是否通过质量保证(QA),在QA过程中,每个芯片都会经过各种测试来保证它可以正常运行.假设你是这个工厂的产品经 ...

  5. week3编程作业: Logistic Regression中一些难点的解读

    %% ============ Part : Compute Cost and Gradient ============ % In this part of the exercise, you wi ...

  6. ufldl学习笔记和编程作业:Softmax Regression(softmax回报)

    ufldl学习笔记与编程作业:Softmax Regression(softmax回归) ufldl出了新教程.感觉比之前的好,从基础讲起.系统清晰,又有编程实践. 在deep learning高质量 ...

  7. ufldl学习笔记与编程作业:Softmax Regression(vectorization加速)

    ufldl学习笔记与编程作业:Softmax Regression(vectorization加速) ufldl出了新教程,感觉比之前的好.从基础讲起.系统清晰,又有编程实践. 在deep learn ...

  8. Andrew Ng机器学习编程作业: Linear Regression

    编程作业有两个文件 1.machine-learning-live-scripts(此为脚本文件方便作业) 2.machine-learning-ex1(此为作业文件) 将这两个文件解压拖入matla ...

  9. ufldl学习笔记与编程作业:Linear Regression(线性回归)

    ufldl学习笔记与编程作业:Linear Regression(线性回归) ufldl出了新教程,感觉比之前的好.从基础讲起.系统清晰,又有编程实践. 在deep learning高质量群里面听一些 ...

随机推荐

  1. Photoshop 更换证件照底色

    1.打开photoshop CS6. 2.打开照片 (上栏)文件---->打开 或者,直接把照片拖进ps中.  3.复制图层 右击背景,点击复制图层 (复制图层的作用是,如果对图层操作错误,可以 ...

  2. SQL优化工具 - SQL Server Profiler与数据库引擎优化顾问

    最近项目做到几千个学生分别去人脸识别记录(目前约630000行)中查询最后一次记录,可想而知性能这块是个麻烦.于是乎,GET到了SQL Server Profiler和数据库引擎优化顾问这俩工SHEN ...

  3. Inception Score

    转载 https://www.jiqizhixin.com/articles/2019-01-10-18    全面解析Inception Score原理及其局限性 https://blog.csdn ...

  4. ubuntu16.04 重置mysql密码

    先登陆服务器,找到自己的my.cnf文件,通常会在 /etc目录下(如果不在,可以用find / -name my.cnf命令找一下), 然后使用 vi my.cnf 命令编辑该文件(建议先备份),在 ...

  5. cf 621E. Wet Shark and Blocks

    神奇,矩阵乘法23333333333333333 递推式是很简单的(连我这种不会DP的人都写出来了.) 需要求出的是转移矩阵(还是叫系数矩阵的),也是最这个东西用快速幂. 这个东西的i,j大概就表示从 ...

  6. Mac系统Snail SVN 精简版配置比较、合并工具:Beyond Compare及破解

    Mac系统 Beyond Compare及破解 前言 在上一篇文章:Mac系统的SVN客户端:Snail SVN 精简版 介绍了在mac系统中svn客户端使用的是snail svn,但是当我想要把本地 ...

  7. python人脸识别项目face-recognition

    该项目基于Github上面的开源项目人脸识别face-recognition,主要是对图像和视频中的人脸进行识别,在开源项目给出的例子基础上对视频人脸识别的KNN算法进行了实现. 0x1 工程项目结构 ...

  8. Tomcat解压版Windows配置(运行环境非开发环境)

    tomcat官网下载的9.0.19,解压后目录如下: java官网下载的jre8 (8u131),目录如下(应该是下载的解压版): 打开tomcat9.0.19根目录下的RUNNING.txt,里面有 ...

  9. 3DES 原理

    3DES的原理: 加密阶段:用密钥1加密->用密钥2解密->用密钥3加密 解密阶段:用密钥3解密->用密钥2加密->用密钥1解密 版权声明:本文为博主原创文章,未经博主允许不得 ...

  10. Javascript object.constructor属性与面向对象编程(oop)

    定义和用法 在 JavaScript 中, constructor 属性返回对象的构造函数. 返回值是函数的引用,不是函数名: JavaScript 数组 constructor 属性返回 funct ...