Python学习笔记——《吴恩达Machine Learning》逻辑回归例程

news2025/1/17 3:08:11

文章目录

逻辑回归和线性回归的区别?

逻辑回归可以理解为线性回归的一个plus版,主要的区别在于逻辑回归使用的是sigmoid函数,而线性回归使用的是线性函数。逻辑回归中通过引入sigmoid函数将线性函数的输出映射到0到1之间的概率值,再加入阈值处理后,使其可以用于二分类问题的预测,如判断一粒肿瘤病理是良性还是恶性。
在这里插入图片描述

正则化逻辑回归

对于一些复杂的数据,用线性函数进行拟合容易造成欠拟合(underfit),而用过多的高次多项式拟合也可能会造成过拟合(overfit),因此除了学习率 α \alpha α外,通过引入另一个变量 λ \lambda λ,用于将与高次项式点乘的向量 w w w中引起过拟合的系数元素置零,可实现正则化的逻辑回归。

逻辑回归中的梯度下降:

在这里插入图片描述

模型预测案例

import numpy as np
import matplotlib.pylab as plt
import scipy.optimize as op

# Load Data
data = np.loadtxt('ex2data1.txt', delimiter=',')
X = data[:, 0:2]
Y = data[:, 2]

# ==================== Part 1: Plotting ====================
print('Plotting data with + indicating (y = 1) examples and o indicating (y = 0) examples.')

# 绘制散点图像
def plotData(x, y):
    pos = np.where(y == 1)
    neg = np.where(y == 0)
    p1 = plt.scatter(x[pos, 0], x[pos, 1], marker='+', s=30, color='b')
    p2 = plt.scatter(x[neg, 0], x[neg, 1], marker='o', s=30, color='y')
    plt.legend((p1, p2), ('Admitted', 'Not admitted'), loc='upper right', fontsize=8)
    plt.xlabel('Exam 1 score')
    plt.ylabel('Exam 2 score')
    plt.show()

plotData(X, Y)
# _ = input('Press [Enter] to continue.')

# ============ Part 2: Compute Cost and Gradient ============
m, n = np.shape(X)
X = np.concatenate((np.ones((m, 1)), X), axis=1)
init_theta = np.zeros((n+1,))

# sigmoid函数
def sigmoid(z):
    g = 1/(1+np.exp(-1*z))
    return g

# 计算损失函数和梯度函数
def costFunction(theta, x, y):
    m = np.size(y, 0)
    h = sigmoid(x.dot(theta))
    if np.sum(1-h < 1e-10) != 0:
        return np.inf
    j = -1/m*(y.dot(np.log(h))+(1-y).dot(np.log(1-h)))
    return j

def gradFunction(theta, x, y):
    m = np.size(y, 0)
    grad = 1 / m * (x.T.dot(sigmoid(x.dot(theta)) - y))
    return grad

cost = costFunction(init_theta, X, Y)
grad = gradFunction(init_theta, X, Y)
print('Cost at initial theta (zeros): ', cost)
print('Gradient at initial theta (zeros): ', grad)
# _ = input('Press [Enter] to continue.')

# ============= Part 3: Optimizing using fmin_bfgs  =============
# 注:此处与原始的情况有些出入
result = op.minimize(costFunction, x0=init_theta, method='BFGS', jac=gradFunction, args=(X, Y))
theta = result.x
print('Cost at theta found by fmin_bfgs: ', result.fun)
print('theta: ', theta)

# 绘制图像
def plotDecisionBoundary(theta, x, y):
    pos = np.where(y == 1)
    neg = np.where(y == 0)
    p1 = plt.scatter(x[pos, 1], x[pos, 2], marker='+', s=60, color='r')
    p2 = plt.scatter(x[neg, 1], x[neg, 2], marker='o', s=60, color='y')
    plot_x = np.array([np.min(x[:, 1])-2, np.max(x[:, 1]+2)])
    plot_y = -1/theta[2]*(theta[1]*plot_x+theta[0])
    plt.plot(plot_x, plot_y)
    plt.legend((p1, p2), ('Admitted', 'Not admitted'), loc='upper right', fontsize=8)
    plt.xlabel('Exam 1 score')
    plt.ylabel('Exam 2 score')
    plt.show()

plotDecisionBoundary(theta, X, Y)
# _ = input('Press [Enter] to continue.')

# ============== Part 4: Predict and Accuracies ==============
prob = sigmoid(np.array([1, 45, 85]).dot(theta))
print('For a student with scores 45 and 85, we predict an admission probability of: ', prob)

# 预测给定值
def predict(theta, x):
    m = np.size(X, 0)
    p = np.zeros((m,))
    pos = np.where(x.dot(theta) >= 0)
    neg = np.where(x.dot(theta) < 0)
    p[pos] = 1
    p[neg] = 0
    return p
p = predict(theta, X)
print('Train Accuracy: ', np.sum(p == Y)/np.size(Y, 0))  #计算训练准确率(p==Y的个数/Y的总个数)

在这里插入图片描述

解决二分类问题:

在这里插入图片描述

不同的 λ \lambda λ会产生不同的分类结果:

import numpy as np
import matplotlib.pylab as plt
import scipy.optimize as op

# 加载数据
data = np.loadtxt('ex2data2.txt', delimiter=',')
X = data[:, 0:2]
Y = data[:, 2]


def plotData(x, y):
    pos = np.where(y == 1)
    neg = np.where(y == 0)
    p1 = plt.scatter(x[pos, 0], x[pos, 1], marker='+', s=50, color='b')
    p2 = plt.scatter(x[neg, 0], x[neg, 1], marker='o', s=50, color='y')
    plt.legend((p1, p2), ('Admitted', 'Not admitted'), loc='upper right', fontsize=8)
    plt.xlabel('Exam 1 score')
    plt.ylabel('Exam 2 score')
    plt.show()


plotData(X, Y)


# =========== Part 1: Regularized Logistic Regression ============
# 向高维扩展
def mapFeature(x1, x2):
    degree = 6
    col = int(degree * (degree + 1) / 2 + degree + 1)
    out = np.ones((np.size(x1, 0), col))
    count = 1
    for i in range(1, degree + 1):
        for j in range(i + 1):
            out[:, count] = np.power(x1, i - j) * np.power(x2, j)
            count += 1
    return out


X = mapFeature(X[:, 0], X[:, 1])
init_theta = np.zeros((np.size(X, 1),))
lamd = 10


# sigmoid函数
def sigmoid(z):
    g = 1 / (1 + np.exp(-1 * z))
    return g


# 损失函数
def costFuncReg(theta, x, y, lam):
    m = np.size(y, 0)
    h = sigmoid(x.dot(theta))
    j = -1 / m * (y.dot(np.log(h)) + (1 - y).dot(np.log(1 - h))) + lam / (2 * m) * theta[1:].dot(theta[1:])
    return j


# 梯度函数
def gradFuncReg(theta, x, y, lam):
    m = np.size(y, 0)
    h = sigmoid(x.dot(theta))
    grad = np.zeros(np.size(theta, 0))
    grad[0] = 1 / m * (x[:, 0].dot(h - y))
    grad[1:] = 1 / m * (x[:, 1:].T.dot(h - y)) + lam * theta[1:] / m
    return grad


cost = costFuncReg(init_theta, X, Y, lamd)
print('Cost at initial theta (zeros): ', cost)
# _ = input('Press [Enter] to continue.')

# ============= Part 2: Regularization and Accuracies =============
init_theta = np.zeros((np.size(X, 1),))
lamd = 10
result = op.minimize(costFuncReg, x0=init_theta, method='BFGS', jac=gradFuncReg, args=(X, Y, lamd))
theta = result.x


def plotDecisionBoundary(theta, x, y):
    pos = np.where(y == 1)
    neg = np.where(y == 0)
    p1 = plt.scatter(x[pos, 1], x[pos, 2], marker='+', s=60, color='r')
    p2 = plt.scatter(x[neg, 1], x[neg, 2], marker='o', s=60, color='y')
    u = np.linspace(-1, 1.5, 50)
    v = np.linspace(-1, 1.5, 50)
    z = np.zeros((np.size(u, 0), np.size(v, 0)))
    for i in range(np.size(u, 0)):
        for j in range(np.size(v, 0)):
            z[i, j] = mapFeature(np.array([u[i]]), np.array([v[j]])).dot(theta)
    z = z.T
    [um, vm] = np.meshgrid(u, v)
    plt.contour(um, vm, z, levels=[0], lw=2)
    plt.legend((p1, p2), ('Admitted', 'Not admitted'), loc='upper right', fontsize=8)
    plt.xlabel('Microchip Test 1')
    plt.ylabel('Microchip Test 2')
    plt.title('lambda = 10')
    plt.show()


plotDecisionBoundary(theta, X, Y)


# 预测给定值
def predict(theta, x):
    m = np.size(X, 0)
    p = np.zeros((m,))
    pos = np.where(x.dot(theta) >= 0)
    neg = np.where(x.dot(theta) < 0)
    p[pos] = 1
    p[neg] = 0
    return p


p = predict(theta, X)
print('Train Accuracy: ', np.sum(p == Y) / np.size(Y, 0))

在这里插入图片描述
λ = 2 : \lambda=2: λ=2
在这里插入图片描述
λ = 10 : \lambda=10: λ=10
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

架构-软件工程模块-3

系统测试 #mermaid-svg-cpVF4noxB0estLWd {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cpVF4noxB0estLWd .error-icon{fill:#552222;}#mermaid-svg-cpVF4noxB0estLWd .error-text{fill:#552222;stroke:#552222;}#…

【Python】判断语句 ③ ( if elif else 语句 | 语法简介 | 代码示例 )

文章目录 一、 if elif else 语句语法二、 代码示例 一、 if elif else 语句语法 在开发场景中 , 经常用到 多条件判定 , 初次判定 , 先进行 条件 1 判定 , 如果 条件 1 满足 则执行 条件 1 对应动作 , 如果 条件 1 不满足 , 则 判定 条件 2 是否满足 , 如果 条件 2 满足 则 …

linux操作系统【进阶完整版】

文章目录 基础命令tailvimsystemctl 用户和组/权限su/sudo创建删除ls -lchmodchown 实用操作快捷键软件安装软链接时区与时间date修改时区 ip、主机名网络传输请求端口 进程管理主机状态监控系统资源占用磁盘信息监控网络状态监控 环境变量上传和下载压缩和解压tarzip/unzip 安…

一、尚医通上传医院接口

文章目录 一、上传医院接口1、集成mongodb1.1添加依赖1.2添加配置 2、添加医院基础类2.1 添加model2.2 添加Repository2.3 添加service接口及实现类2.4 添加controller 3、上传医院3.1 接口数据分析3.2 添加service接口3.3 添加repository接口3.4 添加controller接口3.5 添加帮…

chatgpt赋能Python-python_errno2

Python errno2: 深入了解错误代码并解决问题 当你在使用 Python 进行编程时&#xff0c;不可避免地会遇到一些错误。这些错误通常会被分配一个错误代码&#xff0c;也称为errno。errno2是Python中的一个特定错误代码类型。在本文中&#xff0c;我们将深入了解errno2及其在Pyth…

chatgpt赋能Python-python_errno

Python errno: 什么是errno和它在Python中的应用 在Python编程中&#xff0c;errno是一个非常重要的概念&#xff0c;用于表示系统调用或库函数调用返回的错误代码。在本文中&#xff0c;我们将深入探讨errno是什么&#xff0c;如何在Python中使用它&#xff0c;以及一些常见的…

第3章 TensorFlow进阶

文章目录 第3章 TensorFlow进阶3.1 TensorFlow 的计算模型3.1.1 计算图的工作原理3.1.2 在不同计算图上定义和使用张量进行计算3.2.1 在 GPU 上执行简单的算术运算 3.2 TensorFlow 的嵌入层3.3 TensorFlow 的多层3.4 TensorFlow 实现损失函数3.4.1 softmax 损失函数3.4.1 稀疏矩…

Linux【工具 02】OpenStreetMap数据处理工具OSMCTools下载安装使用举例(osmconvert命令说明)如何获取区域边界说明

OSMCTools安装使用实例 1.Tools2.官网安装步骤3.实际安装步骤3.1 环境3.2 步骤 4.工具使用实例 OpenStreetMap的下载地址&#xff1a;Geofabrik Download Server。 OSMCTools的GitHub地址&#xff1a;https://github.com/ramunasd/osmctools Windows操作系统&#xff0c;可以…

chatgpt赋能Python-python_erf

Python Erf函数 什么是Erf函数&#xff1f; Erf函数也被称为误差函数&#xff0c;是统计学中的一种概率函数&#xff0c;它表示一个随机变量在平均值附近的偏差程度。Erf函数在解决科学问题中非常有用&#xff0c;尤其是在概率论、统计学、物理学等领域。 在Python中如何使用…

【自然语言处理】 - 作业1: Word2Vec及TransE实现

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

Java中的equals和hashCode

目录 equals hashCode equals和hashCode之间的关系 总结 equals equals方法是Object类中用于检测两个对象是否相同的方法&#xff0c;Object类中实现的是两个对象引用是否相同的方法&#xff0c;看以下Object类中代码&#xff1a; public boolean equals(Object obj) {ret…

LInux线程

Linux线程介绍 1、进程与线程&#xff1a; 典型的UNIX/Linux进程可以看成只有一个控制线程&#xff1a;一个进程在同一时刻只做一件事情。有了多个控制线程后&#xff0c;在程序设计时可以把进程设计成在同一时刻做不止一件事&#xff0c;每个线程各自处理独立的任务。 进程是…

【自然语言处理】 - 作业2: seq2seq模型机器翻译

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

Python地理空间分析快速入门

地理空间数据描述了地球表面上的任何物体或特征。 常见的例子包括&#xff1a; 品牌应该在哪里开设下一家门店&#xff1f;天气如何影响区域销售&#xff1f;乘车的最佳路线是什么&#xff1f;哪个地区受飓风影响最严重&#xff1f;冰盖融化与碳排放有何关系&#xff1f;哪些地…

chatgpt赋能Python-python_dog

Python Dog: 一个好玩的机器人狗 Python Dog是一个由Python编程语言编写的机器人狗。它是一个有趣且有用的工具&#xff0c;可以帮助您学习Python编程&#xff0c;并了解如何通过Python编写和控制机器人。在本文中&#xff0c;我们将介绍Python Dog的功能&#xff0c;并讨论为…

Leetcode每日一题——“用栈实现队列”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是用栈实现队列&#xff0c;这和小雅兰的上一篇博客“用队列实现栈”好像有点点关系噢&#xff0c;事实上&#xff0c;也确实是这样的&#xff0c;下面&#xff0c;让我们进入Leetcode的世界吧&#xff01;&…

RK3399平台开发系列讲解(网络篇)Linux 发送网络包流程

🚀返回专栏总目录 文章目录 一、发送网络包流程图二、发送网络包步骤沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将详细介绍Linux网络包发包流程。 一、发送网络包流程图 二、发送网络包步骤 VFS 层:write 系统调用找到 struct file,根据里面的 file_oper…

chatgpt赋能Python-python_end___t_

Python中的end\t’介绍 Python是一种非常流行的编程语言&#xff0c;它在各种领域中得到广泛应用。与许多其他编程语言不同的是&#xff0c;Python中提供了一种方便的 way来创建格式化字符串。一个常见的方法是使用end‘\t’。 在本文中&#xff0c;我将介绍Python中的end‘\…

常见 Web 安全攻防总结

Web 安全地对于 Web 从业人员来说是一个非常重要的课题&#xff0c;所以在这里总结一下 Web 相关的安全攻防知识&#xff0c;希望以后不要再踩雷&#xff0c;也希望对看到这篇文章的同学有所帮助。今天这边文章主要的内容就是分析几种常见的攻击的类型以及防御的方法。 也许你对…

QTP10.0安装及问题

1、如果没有特殊要求&#xff0c;安装都是直接选下一步 2、然后出现问题就是 提示脚本调试器没有下载成功&#xff1a; 看提示就是缺了一个东西&#xff0c;另外下载安装就可以 百度网盘 请输入提取码 链接&#xff1a;https://pan.baidu.com/s/195hEKOPbpp37okysutcqEQ 提取…