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(θ)=m1​i=1∑m​21​(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(θ)=m1​i=1∑m​Cost(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(θ)=m1​i=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(θ)=−m1​i=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()

吴恩达机器学习(五)逻辑回归练习-二分类练习相关推荐

  1. 吴恩达机器学习之逻辑回归(二分类)

    吴恩达机器学习之逻辑回归 逻辑回归 二分类逻辑回归 二分类逻辑回归案例 python代码实现(含详细代码注释): 案例中几个问题的解析 不同于线性回归,逻辑回归的hθ(x)还需要用sigmoid函数处 ...

  2. 吴恩达机器学习ex2:逻辑回归

    吴恩达机器学习练习二:逻辑回归 1. 逻辑回归(logistic regression) 构建一个可以基于两次测试评分来评估录取可能性的分类模型. 知识点回顾: 1.1 数据可视化 #coding=u ...

  3. 吴恩达机器学习之逻辑回归:逻辑回归的假说表示、判定边界、代价函数、简化的成本函数和梯度下降、高级悠哈、多类别分类之一对多(详细笔记,建议收藏,已有专栏)

    吴恩达机器学习栏目清单 专栏直达:https://blog.csdn.net/qq_35456045/category_9762715.html 文章目录 6.逻辑回归(Logistic Regres ...

  4. 吴恩达机器学习 4.逻辑回归(Logistic Regression)

    1.分类问题 在分类问题中,你要预测的变量yyy是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法.在分类问题中,我们尝 ...

  5. 吴恩达机器学习:逻辑回归

    在 上一周的课程 里,Andrew Ng 为我们介绍了什么是机器学习以及监督学习中的线性回归.对于一个监督学习,我们要确定我们的 预测函数,代价函数,然后利用梯度下降算法找到 代价函数 最小时,预测函 ...

  6. 吴恩达机器学习之逻辑回归理论部分

    一.特征函数 对应分类问题,我们先针对二分类问题进行讨论,对应计算机而言,分类即将数据按其特征值不同分为不同的集合,仅对应二分类问题,我们只需考虑分为:正类和负类,为此我们引入特征函数. y=1 - ...

  7. 吴恩达机器学习3——逻辑回归、正则化

    机器学习第三周 一.逻辑回归 1. 分类问题 1.1 分类的概念 1.2 使用线性回归来解决分类模型 1.3 逻辑回归模型 1.4 分类边界 2. 逻辑回归模型 logistic regression ...

  8. 吴恩达机器学习CS229A_EX2_逻辑回归与正则化_Python3

    逻辑回归 问题描述:特征集为学生的两门课的成绩,标签集为是否被大学录取. 说明: 这里调用 scipy 库函数执行梯度下降的具体迭代,不用手动设置步长和迭代次数,但 cost 如何计算.梯度如何求取需 ...

  9. 吴恩达机器学习作业——逻辑回归

    1 Logistic regression 在这部分的练习中,你将建立一个逻辑回归模型来预测一个学生是否能进入大学.假设你是一所大学的行政管理人员,你想根据两门考试的结果,来决定每个申请人是否被录取. ...

最新文章

  1. html盒子阴影的语法,css3 盒阴影box-shadow
  2. ROS自定义地图(CAD、手绘等)
  3. CSRF的绕过与利用
  4. UI设计师遇到瓶颈如何自我提升?
  5. 2950交换机简明配置维护手册
  6. Cocoa异常编程 NSException
  7. 给 VS2008 / VS2010 MFC 项目添加启动画面
  8. 如何对xgboost模型进行优化
  9. [POI2006]ORK-Ploughing
  10. 移动端element日期插件不弹软键盘
  11. centos安装bzip2
  12. Python 高级:人工智能概述
  13. 好的vue框架-模板
  14. 【学生管理系统】用户管理之用户登录
  15. 某些年自己做的毕业设计代码和分析过程记录
  16. ubuntu下的android JNI入门DEMO
  17. 《江南style》影射的经济style
  18. 【面试题-算法思想】如何从包含大量URL的A,B文件中找到相同的URL?
  19. 鞋城商城-servlet+jsp
  20. 用手机访问计算机FTP服务器并下载文件

热门文章

  1. 常用的电子邮箱排名,tom163.net收费邮箱介绍大全!
  2. 用MinGW编译AWTK填坑录
  3. Dcoker Swarm 集群部署
  4. 简单的二维码识别(实现代码)
  5. 【私人订制Python模块库】Pyemail:更方便快捷地发送电子邮件
  6. 水很深的深度学习|Task 01
  7. 微信小程序Canvas绘制曲线图饼图柱状图雷达图蛛网图实现(附源码)
  8. 给计算机老师致歉信,给老师的道歉信500字范文
  9. C语言高级专题(4)-------指针和数组的高级应用
  10. Linux搭建DNS服务