吴恩达机器学习(五)逻辑回归练习-二分类练习
1、基础内容
(1)公式总结:
(2)内容回归:
逻辑回归主要是进行二分类和多分类。
二分类中,分为线性可分和线性不可分。
对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将hθ(x){h_\theta}(x)hθ(x)带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convexfunction)。
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
线性回归的代价函数为:J(θ)=1m∑i=1m12(hθ(x(i))−y(i))2J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{1}{2}{{\left( {h_\theta}\left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}}J(θ)=m1i=1∑m21(hθ(x(i))−y(i))2 。
我们重新定义逻辑回归的代价函数为:J(θ)=1m∑i=1mCost(hθ(x(i)),y(i))J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{{Cost}\left( {h_\theta}\left( {x}^{\left( i \right)} \right),{y}^{\left( i \right)} \right)}J(θ)=m1i=1∑mCost(hθ(x(i)),y(i)),其中
hθ(x){h_\theta}\left( x \right)hθ(x)与 Cost(hθ(x),y)Cost\left( {h_\theta}\left( x \right),y \right)Cost(hθ(x),y)之间的关系如下图所示:
这样构建的Cost(hθ(x),y)Cost\left( {h_\theta}\left( x \right),y \right)Cost(hθ(x),y)函数的特点是:当实际的 y=1y=1y=1 且hθ(x){h_\theta}\left( x \right)hθ(x)也为 1 时误差为 0,当 y=1y=1y=1 但hθ(x){h_\theta}\left( x \right)hθ(x)不为1时误差随着hθ(x){h_\theta}\left( x \right)hθ(x)变小而变大;当实际的 y=0y=0y=0 且hθ(x){h_\theta}\left( x \right)hθ(x)也为 0 时代价为 0,当y=0y=0y=0 但hθ(x){h_\theta}\left( x \right)hθ(x)不为 0时误差随着 hθ(x){h_\theta}\left( x \right)hθ(x)的变大而变大。
将构建的 Cost(hθ(x),y)Cost\left( {h_\theta}\left( x \right),y \right)Cost(hθ(x),y)简化如下:
Cost(hθ(x),y)=−y×log(hθ(x))−(1−y)×log(1−hθ(x))Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right)Cost(hθ(x),y)=−y×log(hθ(x))−(1−y)×log(1−hθ(x))
带入代价函数得到:
J(θ)=1m∑i=1m[−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=1∑m[−y(i)log(hθ(x(i)))−(1−y(i))log(1−hθ(x(i)))]
即:J(θ)=−1m∑i=1m[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=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
进行向量化表示;
梯度下降和线性回归思路一样:
2、二分类案例(线性可分)___依据两次测试的成绩,预测是否被大学录取
(1)读取数据、绘制图像
"""二分类案例:依据两次测试的成绩,预测是否被大学录取
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 1、读取数据
# 读取数据
df = pd.read_csv('ex2data1.txt',header=None,names=['exam1','exam2','accepted'])
print(df.head())
# exam1 exam2 accepted
# 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# 2、绘制图像
# 绘图
fig,ax = plt.subplots()
ax.scatter(df[df['accepted'] == 0]['exam1'],df[df['accepted'] == 0]['exam2'],c = 'red',marker='x' ,label='y=0')
ax.scatter(df[df['accepted'] == 1]['exam1'],df[df['accepted'] == 1]['exam2'],c = 'green',marker='o',label='y=1' )
ax.legend()
ax.set(xlabel='exam1',ylabel='exam2',title='Fig')
plt.show()
可以看出一个二分类问题。
(2)计算theta_final
# 3、从数据集中切分出X和y
def getX_y(df):# 添加一列df.insert(0,'const',1)# 切出X 以及 yX = df.iloc[:,0:-1]y = df.iloc[:, -1]# 将X 和 y转换为数组的形式X = X.valuesy = y.valuesy = y.reshape(len(y),1)return X,yX,y = getX_y(df)
# 定义激活函数
def sigmod(z):return 1 / (1 + np.exp(-z))# 定义costFunction
def costFunction(X, y, theta):A = sigmod(X @ theta)first = y * np.log(A)second = (1 - y) * np.log(1 - A)return -np.sum(first + second) / len(y)# 定义梯度下降函数
def gradientDescent(X, y, theta, alpha, iters):costs = []for i in range(iters):A = sigmod(X @ theta)theta = theta - (alpha * X.T @ (A - y)) / (len(y))cost = costFunction(X, y, theta)costs.append(cost)if i % 1000 == 0:print(cost)return theta, costsalpha = 0.004
iters = 200000
# 初始化theta
theta = np.zeros((3,1))theta_final,costs = gradientDescent(X,y,theta,alpha,iters)
print(theta_final)
(3)计算预测准确率,绘制决策边界
# 定义预测函数
def predict(X, theta):p = sigmod(X @ theta)return [1 if x >= 0.5 else 0 for x in p]# 计算预测的准确性
y_ = np.array(predict(X,theta_final))
y_pre = y_.reshape(len(y_),1)
acc = np.mean(y_pre == y)
print(acc) # 0.91# 绘制决策边界
x = np.linspace(20,100,100)
f = - theta_final[0,0] / theta_final[2,0] - theta_final[1,0] / theta_final[2,0] * x# 绘图
fig,ax = plt.subplots()
ax.scatter(df[df['accepted'] == 0]['exam1'],df[df['accepted'] == 0]['exam2'],c = 'red',marker='x' ,label='y=0')
ax.scatter(df[df['accepted'] == 1]['exam1'],df[df['accepted'] == 1]['exam2'],c = 'green',marker='o',label='y=1' )
ax.plot(x,f,c = 'blue',label='border' )
ax.legend()
ax.set(xlabel='exam1',ylabel='exam2',title='Fig')
plt.show()
3、二分类案例(线性不可分)___依据两次测试的成绩,决定芯片要被抛弃还是接受
没有办法用一条直线进行切分。
需要特征映射:
为了防止过拟合,需要加上正则项:
(1)读取原始数据,画图
"""逻辑回归练习(线性不可分):决定芯片要被抛弃还是接受数据集: 芯片在两次测试中的测试结果
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 读取数据
df = pd.read_csv('ex2data2.txt',header=None,names=['test1','test2','accepted'])
print(df.head())# test1 test2 accepted
# 0 0.051267 0.69956 1
# 1 -0.092742 0.68494 1
# 2 -0.213710 0.69225 1
# 3 -0.375000 0.50219 1
# 4 -0.513250 0.46564 1# 绘图
fig,ax = plt.subplots()
ax.scatter(df[df['accepted'] == 0]['test1'],df[df['accepted'] == 0]['test2'],c = 'red',marker='x' ,label='y=0')
ax.scatter(df[df['accepted'] == 1]['test1'],df[df['accepted'] == 1]['test2'],c = 'green',marker='o',label='y=1' )
ax.legend()
ax.set(xlabel='test1',ylabel='test2',title='Fig')
plt.show()
(2)使用特征映射,定义函数计算theta
# 线性不可分,用特征映射
def feature_mapping(x1, x2, power):data = {}for i in np.arange(power + 1):for j in np.arange(i + 1):data['F{}{}'.format(i - j, j)] = np.power(x1, i - j) * np.power(x2, j)return pd.DataFrame(data)
x1 = df['test1']
x2 = df['test2']mdf = feature_mapping(x1,x2,6)
# 从两个数据集中切分别分出X和y
# 切出X 以及 y
y = df.iloc[:, -1]
# 将X 和 y转换为数组的形式
X = mdf.values
y = y.values
y = y.reshape(len(y),1)
# 定义激活函数
def sigmod(z):return 1 / (1 + np.exp(-z))# 定义costFunction
def costFunction(X, y, theta, lamda):A = sigmod(X @ theta)first = y * np.log(A)second = (1 - y) * np.log(1 - A)#加入正则化项reg = np.sum( np.power(theta[1:],2) ) * (lamda / (2 * len(y)) )return -np.sum(first + second) / len(y) + reg# 定义梯度下降函数
def gradientDescent(X, y, theta, alpha, iters, lamda):costs = []for i in range(iters):reg = theta[1:] * (lamda / len(y))reg = np.insert(reg, 0, values=0, axis=0)A = sigmod(X @ theta)theta = theta - (alpha * X.T @ (A - y)) / (len(y)) - alpha * regcost = costFunction(X, y, theta, lamda)costs.append(cost)if i % 1000 == 0:print(cost)return theta, costs
# 初始化参数
alpha = 0.001
iters = 20000
# lamda = 0.001
lamda = 0.0001
theta = np.zeros((28,1))
# 计算
theta_final,costs = gradientDescent(X,y,theta,alpha,iters,lamda)
print(theta_final)
(3)计算预测准确率,画出决策边界
# 定义预测函数
def predict(X, theta):p = sigmod(X @ theta)return [1 if x >= 0.5 else 0 for x in p]
# 计算预测的准确性
y_ = np.array(predict(X,theta_final))
y_pre = y_.reshape(len(y_),1)
acc = np.mean(y_pre == y)
print(acc) # 0.7796610169491526# 绘制决策边界
x = np.linspace(-1.2,1.2,200)
xx,yy = np.meshgrid(x,x)
print(xx.shape)
z = feature_mapping(xx.ravel(),yy.ravel(),6).values
zz = z @ theta_final
zz = zz.reshape(200,200)fig,ax = plt.subplots()
ax.scatter(df[df['accepted'] == 0]['test1'],df[df['accepted'] == 0]['test2'],c = 'red',marker='x' ,label='y=0')
ax.scatter(df[df['accepted'] == 1]['test1'],df[df['accepted'] == 1]['test2'],c = 'blue',marker='o',label='y=1' )
ax.legend()
ax.set(xlabel='test1',ylabel='test2',title='Fig')
plt.contour(xx,yy,zz,0)
plt.show()
吴恩达机器学习(五)逻辑回归练习-二分类练习相关推荐
- 吴恩达机器学习之逻辑回归(二分类)
吴恩达机器学习之逻辑回归 逻辑回归 二分类逻辑回归 二分类逻辑回归案例 python代码实现(含详细代码注释): 案例中几个问题的解析 不同于线性回归,逻辑回归的hθ(x)还需要用sigmoid函数处 ...
- 吴恩达机器学习ex2:逻辑回归
吴恩达机器学习练习二:逻辑回归 1. 逻辑回归(logistic regression) 构建一个可以基于两次测试评分来评估录取可能性的分类模型. 知识点回顾: 1.1 数据可视化 #coding=u ...
- 吴恩达机器学习之逻辑回归:逻辑回归的假说表示、判定边界、代价函数、简化的成本函数和梯度下降、高级悠哈、多类别分类之一对多(详细笔记,建议收藏,已有专栏)
吴恩达机器学习栏目清单 专栏直达:https://blog.csdn.net/qq_35456045/category_9762715.html 文章目录 6.逻辑回归(Logistic Regres ...
- 吴恩达机器学习 4.逻辑回归(Logistic Regression)
1.分类问题 在分类问题中,你要预测的变量yyy是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法.在分类问题中,我们尝 ...
- 吴恩达机器学习:逻辑回归
在 上一周的课程 里,Andrew Ng 为我们介绍了什么是机器学习以及监督学习中的线性回归.对于一个监督学习,我们要确定我们的 预测函数,代价函数,然后利用梯度下降算法找到 代价函数 最小时,预测函 ...
- 吴恩达机器学习之逻辑回归理论部分
一.特征函数 对应分类问题,我们先针对二分类问题进行讨论,对应计算机而言,分类即将数据按其特征值不同分为不同的集合,仅对应二分类问题,我们只需考虑分为:正类和负类,为此我们引入特征函数. y=1 - ...
- 吴恩达机器学习3——逻辑回归、正则化
机器学习第三周 一.逻辑回归 1. 分类问题 1.1 分类的概念 1.2 使用线性回归来解决分类模型 1.3 逻辑回归模型 1.4 分类边界 2. 逻辑回归模型 logistic regression ...
- 吴恩达机器学习CS229A_EX2_逻辑回归与正则化_Python3
逻辑回归 问题描述:特征集为学生的两门课的成绩,标签集为是否被大学录取. 说明: 这里调用 scipy 库函数执行梯度下降的具体迭代,不用手动设置步长和迭代次数,但 cost 如何计算.梯度如何求取需 ...
- 吴恩达机器学习作业——逻辑回归
1 Logistic regression 在这部分的练习中,你将建立一个逻辑回归模型来预测一个学生是否能进入大学.假设你是一所大学的行政管理人员,你想根据两门考试的结果,来决定每个申请人是否被录取. ...
最新文章
- html盒子阴影的语法,css3 盒阴影box-shadow
- ROS自定义地图(CAD、手绘等)
- CSRF的绕过与利用
- UI设计师遇到瓶颈如何自我提升?
- 2950交换机简明配置维护手册
- Cocoa异常编程 NSException
- 给 VS2008 / VS2010 MFC 项目添加启动画面
- 如何对xgboost模型进行优化
- [POI2006]ORK-Ploughing
- 移动端element日期插件不弹软键盘
- centos安装bzip2
- Python 高级:人工智能概述
- 好的vue框架-模板
- 【学生管理系统】用户管理之用户登录
- 某些年自己做的毕业设计代码和分析过程记录
- ubuntu下的android JNI入门DEMO
- 《江南style》影射的经济style
- 【面试题-算法思想】如何从包含大量URL的A,B文件中找到相同的URL?
- 鞋城商城-servlet+jsp
- 用手机访问计算机FTP服务器并下载文件