吴恩达机器学习课后题-02逻辑回归

news2024/12/26 9:21:31

逻辑回归

  • 逻辑回归基本知识点:分类
    • Cost function(代价函数)
    • 梯度下降
  • 题目
    • 线性可分
      • 散点图
      • 决策边界
    • 线性不可分
      • 题目
      • 特征映射
      • 代价函数(损失函数)
      • 梯度下降
      • 结果

逻辑回归基本知识点:分类

在这里插入图片描述

在这里插入图片描述

Cost function(代价函数)

在这里插入图片描述

在这里插入图片描述

梯度下降

在这里插入图片描述

题目

线性可分

在这里插入图片描述

散点图

#线性可分
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


data=pd.read_csv("E:/学习/研究生阶段/python-learning/吴恩达机器学习课后作业/code/ex2-logistic regression/ex2data1.txt",names=["Exam1","Exam2","Accepted"])
# print(data)
data.insert(0,"ones",1)
x=data.iloc[:,0:-1]#取数据的0-倒数第二列,取所有行
y=data.iloc[:,-1:]
x=x.values
y=y.values
# print(x,y)
fig,ax=plt.subplots()
ax.scatter(data[data["Accepted"]==0]["Exam1"],data[data["Accepted"]==0]["Exam2"],c="r",marker="x",label="y=0")
ax.scatter(data[data["Accepted"]==1]["Exam1"],data[data["Accepted"]==1]["Exam2"],c="g",marker="o",label="y=1")
ax.legend()
ax.set(xlabel="Exam1",ylabel="Exam2")
plt.show()

在这里插入图片描述

决策边界

在这里插入图片描述

#线性可分
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

"""
原始数据处理函数

"""
def get_x_y(data):
    data.insert(0, "ones", 1)
    x = data.iloc[:, 0:-1]  # 取数据的0-倒数第二列,取所有行
    y = data.iloc[:, -1:]
    x = x.values
    y = y.values
    return x,y
def sigmoid(z):
    return 1/(1+np.exp(-z))

def cost_function(x,y,theta):
    y_=sigmoid(x @ theta)
    return np.sum(-(y*np.log(y_)+(1-y)*np.log(1-y_))/len(x))

"""
定义梯度下降函数
alpha:学习速率
inters:迭代次数
"""
def gradientDescent(x,y,theta,alpha,inters):
    costs = []
    for i in range(inters):
        theta=theta-alpha*x.T @ (sigmoid(x @ theta)-y)/len(x)

        cost=cost_function(x,y,theta)
        costs.append(cost)
        if i%1000==0:
            print(cost)

    return theta,costs


def predict(X,theta):
    prob = sigmoid(X@theta)
    return [1 if x >= 0.5 else 0 for x in prob]






data=pd.read_csv("E:/学习/研究生阶段/python-learning/吴恩达机器学习课后作业/code/ex2-logistic regression/ex2data1.txt",names=["Exam1","Exam2","Accepted"])
# print(data)
x,y=get_x_y(data)
print(x)
theta=np.zeros((x.shape[1],1))#theta初始值x.shape[1] x 1零矩阵
alpha=0.004#学习速率初始化
inters=200000#迭代次数初始化
print(x.shape[1])
"""
预测
"""
theta,costs=gradientDescent(x,y,theta,alpha,inters)
print(theta)
y_ = np.array(predict(x,theta))
y_pre = y_.reshape(len(y_),1)
acc = np.mean(y_pre==y)#acc准确率
print(acc)

fig,ax=plt.subplots()
ax.scatter(data[data["Accepted"]==0]["Exam1"],data[data["Accepted"]==0]["Exam2"],c="r",marker="x",label="y=0")
ax.scatter(data[data["Accepted"]==1]["Exam1"],data[data["Accepted"]==1]["Exam2"],c="g",marker="o",label="y=1")

x_x1=x[:,1].reshape(len(x),1)

y_x2=-(theta[0,0]/theta[2,0])-(theta[1,0]/theta[2,0])*x_x1

ax.plot(x_x1,y_x2,"r",label="jiexian")

ax.legend()
ax.set(xlabel="Exam1",ylabel="Exam2")


plt.show()

在这里插入图片描述

线性不可分

在这里插入图片描述
特征映射
在这里插入图片描述

题目

在这里插入图片描述

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data=pd.read_csv("E:/学习/研究生阶段/python-learning/吴恩达机器学习课后作业/code/ex2-logistic regression/ex2data2.txt",names=["Test1","Test2","Accepted"])

fig,ax=plt.subplots()
ax.scatter(data[data["Accepted"]==0]["Test1"],data[data["Accepted"]==0]["Test2"],c="r",marker="x",label="y=0")
ax.scatter(data[data["Accepted"]==1]["Test1"],data[data["Accepted"]==1]["Test2"],c="g",marker="o",label="y=1")

ax.legend()
ax.set(xlabel="Test1",ylabel="Test2")
plt.show()

在这里插入图片描述

特征映射

def feature_mapping(x1,x2,power):
    data_dirc={}
    for i in np.arange(power + 1):
        for j in np.arange(i + 1):
            data_dirc['F{}{}'.format(i-j, j)] = np.power(x1, i - j) * np.power(x2, j)
    return pd.DataFrame(data_dirc)

代码解释

这段代码定义了一个名为 feature_mapping 的函数,它接收三个参数:x1 和 x2(这两个参数通常是数值型数据,比如两个特征变量),以及 power(一个整数,表示幂次的上限)。函数的目的是根据输入的 x1 和 x2,以及指定的 power,生成一个新的特征映射(feature mapping)数据集,并以 pandas.DataFrame 的形式返回。

在特征映射过程中,函数通过嵌套循环遍历所有可能的幂次组合,其中 i 的范围从 0 到 power(包含),而 j 的范围从 0 到 i(包含)。对于每一对 (i, j),它计算 x1 的 (i-j) 次幂与 x2 的 j 次幂的乘积,并将这个乘积作为新特征的值。新特征的名称由 'F{}{}' 格式化字符串生成,其中第一个 {} 填入 (i-j),第二个 {} 填入 j。

然而,代码中存在一个潜在的问题:它没有导入 numpy 和 pandas 库,这两个库在代码中被使用。为了使代码正常工作,你需要在代码的开始处添加以下导入语句:

python
import numpy as np  
import pandas as pd
完整的函数代码应该如下所示:

python
import numpy as np  
import pandas as pd  
  
def feature_mapping(x1, x2, power):  
    data_dirc = {}  
    for i in np.arange(power + 1):  
        for j in np.arange(i + 1):  
            data_dirc['F{}{}'.format(i-j, j)] = np.power(x1, i - j) * np.power(x2, j)  
    return pd.DataFrame(data_dirc)  
  
# 示例用法  
x1 = 2  
x2 = 3  
power = 2  
result = feature_mapping(x1, x2, power)  
print(result)
这个示例中,x1 设置为 2,x2 设置为 3,power 设置为 2。因此,函数会生成包含以下特征的数据框:

F00(x1^0 * x2^0)
F10(x1^1 * x2^0)
F11(x1^1 * x2^1)
F20(x1^2 * x2^0)
F21(x1^2 * x2^1)
这些特征对应于 x1 和 x2 的不同幂次组合,可用于机器学习模型中以增加模型的非线性。

代价函数(损失函数)

在这里插入图片描述

def sigmoid(z):
    return 1/(1+np.exp(-z))

def cost_function(x,y,theta,lr):
    y_=sigmoid(x @ theta)

    reg=np.sum(np.power(theta[1:]),2)*(lr/(2*len(x)))#正则化
    return np.sum(-(y*np.log(y_)+(1-y)*np.log(1-y_))/len(x))+reg

梯度下降

在这里插入图片描述


"""
定义梯度下降函数
alpha:学习速率
inters:迭代次数
lamda
"""
def gradientDescent(x,y,theta,alpha,inters,lamda):
    costs = []
    for i in range(inters):

        reg = theta[1:] * (lamda / len(x))  #
        reg = np.insert(reg, 0, values=0, axis=0) #在第一个元素前插入0,为了与后面维数匹配
        theta=theta-alpha*x.T @ (sigmoid(x @ theta)-y)/len(x)


        cost=cost_function(x,y,theta,lamda)
        costs.append(cost)
        # if i%1000==0:
        #     print(cost)

    return theta,costs
"""
准确率预测
"""
def predict(X,theta):
    prob = sigmoid(X@theta)
    return [1 if x >= 0.5 else 0 for x in prob]

结果

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


"""
原始数据处理函数

"""
def get_x_y(data):
    data.insert(0, "ones", 1)
    x = data.iloc[:, 0:-1]  # 取数据的0-倒数第二列,取所有行
    y = data.iloc[:, -1:]
    x = x.values
    y = y.values
    return x,y


"""
特征映射

"""
def feature_mapping(x1,x2,power):
    data_dirc={}
    for i in np.arange(power + 1):
        for j in np.arange(i + 1):
            data_dirc['F{}{}'.format(i-j, j)] = np.power(x1, i - j) * np.power(x2, j)
    return pd.DataFrame(data_dirc)

"""
代价函数
"""
def sigmoid(z):
    return 1/(1+np.exp(-z))

def cost_function(x,y,theta,lamda):
    y_=sigmoid(x @ theta)

    reg=np.sum(np.power(theta[1:],2))*(lamda/(2*len(x)))#正则化
    return np.sum(-(y*np.log(y_)+(1-y)*np.log(1-y_))/len(x))+reg


"""
定义梯度下降函数
alpha:学习速率
inters:迭代次数
lamda
"""
def gradientDescent(x,y,theta,alpha,inters,lamda):
    costs = []
    for i in range(inters):

        reg = theta[1:] * (lamda / len(x))  #
        reg = np.insert(reg, 0, values=0, axis=0) #在第一个元素前插入0,为了与后面维数匹配
        theta=theta-alpha*x.T @ (sigmoid(x @ theta)-y)/len(x)


        cost=cost_function(x,y,theta,lamda)
        costs.append(cost)
        # if i%1000==0:
        #     print(cost)

    return theta,costs
"""
准确率预测
"""
def predict(X,theta):
    prob = sigmoid(X@theta)
    return [1 if x >= 0.5 else 0 for x in prob]


data=pd.read_csv("E:/学习/研究生阶段/python-learning/吴恩达机器学习课后作业/code/ex2-logistic regression/ex2data2.txt",names=["Test1","Test2","Accepted"])
# # fig,ax=plt.subplots()
# # ax.scatter(data[data["Accepted"]==0]["Test1"],data[data["Accepted"]==0]["Test2"],c="r",marker="x",label="y=0")
# # ax.scatter(data[data["Accepted"]==1]["Test1"],data[data["Accepted"]==1]["Test2"],c="g",marker="o",label="y=1")
# # ax.legend()
# # ax.set(xlabel="Test1",ylabel="Test2")
# # plt.show()
x1=data["Test1"]
x2=data["Test2"]
power=6
data_=feature_mapping(x1,x2,power)
x=data_.values
y = data.iloc[:, -1:].values
theta=np.zeros((x.shape [1],1))#theta初始值x.shape[1] x 1零矩阵
lamda=0.001
alpha=0.001#学习速率初始化
inters=200000#迭代次数初始化
# cost_init=cost_function(x,y,theta, lamda)
# print(cost_init)
theta,costs=gradientDescent(x,y,theta,alpha,inters,lamda)
print(theta)

y_ = np.array(predict(x,theta))
y_pre = y_.reshape(len(y_),1)
acc = np.mean(y_pre==y)#acc准确率
print(acc)

fig,ax=plt.subplots()
ax.scatter(data[data["Accepted"]==0]["Test1"],data[data["Accepted"]==0]["Test2"],c="r",marker="x",label="y=0")
ax.scatter(data[data["Accepted"]==1]["Test1"],data[data["Accepted"]==1]["Test2"],c="g",marker="o",label="y=1")
ax.legend()
ax.set(xlabel="Test1",ylabel="Test2")

x_plot= np.linspace(-1.2,1.2,200)
xx,yy = np.meshgrid(x_plot,x_plot)
z = feature_mapping(xx.ravel(),yy.ravel(),power).values
zz=z @ theta
zz=zz.reshape(xx.shape)
plt.contour(xx,yy,zz,0)

plt.show()


在这里插入图片描述

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

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

相关文章

Upload-Lab第16关:巧妙利用图片马方式绕过exif_imagetype验证

简介 在第16关中,解决方法与第14和第15关类似,都是通过修改文件头来绕过文件上传验证。然而,第16关额外使用了 php_exif模块对文件进行校验。因此,在尝试解决这一关时,需要确保php_exif模块已启用,如下图所示: php_exif.dll–找不到指定的模块 要想php_exif能够被成功…

Github 2024-08-22 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-08-22统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1精选Go框架、库和软件列表 创建周期:3700 天开发语言:Go协议类型:MIT LicenseStar数量:127377 个Fork数量:11751 …

ardupilot开发 --- C嘎嘎 篇

无情的猜猜猜又卜了一挂 cout和cin的使用&#xff0c;标准输入输出<< 和 >> 的使用数据类型&#xff08;函数&#xff09;模板的使用&#xff1a;命名空间的使用&#xff0c;std命名空间语句块new 的使用引用 &共用体union类对象的赋值&#xff1a;operator函数…

实现 FastCGI

CGI的由来&#xff1a; 最早的 Web 服务器只能简单地响应浏览器发来的 HTTP 请求&#xff0c;并将存储在服务器上的 HTML 文件返回给浏 览器&#xff0c;也就是静态 html 文件&#xff0c;但是后期随着网站功能增多网站开发也越来越复杂&#xff0c;以至于出现动态技 术&…

仿Muduo库实现高并发服务器——Connection模块

这个模块看着代码挺多的实则真的很多&#xff0c;但是不难&#xff0c;我为大家将各个函数拿出来理一理。 connection就是将主线程监听的网络套接字上的客户端套接字进行包装&#xff0c;使被包装的套接字可以进行&#xff0c;各种事件的处理&#xff0c;比如读写事件。下面就来…

3D场景标注标签信息,three.js CSS 2D渲染器CSS2DRenderer、CSS 3D渲染器CSS3DRenderer(结合react)

如果你想用HTML元素作为标签标注三维场景中模型信息&#xff0c;需要考虑定位的问题。比如一个模型&#xff0c;在代码中你可以知道它的局部坐标或世界坐标xyz&#xff0c;但是你并不知道渲染后在canvas画布上位置&#xff0c;距离web页面顶部top和左侧的像素px值。自己写代码把…

探秘黑魔术玫瑰:花语与魅力的交织

一、黑魔术玫瑰的花语解读 黑魔术玫瑰的花语丰富而深邃&#xff0c;充满了神秘与诱惑。在许多文化中&#xff0c;其深沉的颜色被赋予了神秘的象征意义&#xff0c;代表着那些尚未被揭示的秘密和未知的领域。它仿佛是隐藏在黑暗中的谜题&#xff0c;吸引着人们去探索和追寻。 禁…

plsql表格怎么显示中文 plsql如何导入表格数据

在Oracle数据库开发中&#xff0c;PL/SQL Developer是一款广泛使用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了丰富的功能来帮助开发人员高效地进行数据库开发和管理。在使用PL/SQL Developer时&#xff0c;许多用户会遇到表格显示中文的问题&#xff0c;以…

DRF——请求的封装与版本管理

文章目录 django restframework1. 快速上手2. 请求数据的封装3. 版本管理3.1 URL的GET参数传递&#xff08;*&#xff09;3.2 URL路径传递&#xff08;*&#xff09;3.3 请求头传递3.4 二级域名传递3.5 路由的namespace传递 小结 django restframework 快速上手请求的封装版本…

SQL,解析 json

Google BigQuery数据库的data表存储了若干多层的Json串&#xff0c;其中一条形如&#xff1a; [{"active":true,"key":"key1","values":[{"active":true,"value":"value1"}]},{"active":tru…

如何在分布式环境中实现高可靠性分布式锁

目录 一、简单了解分布式锁 &#xff08;一&#xff09;分布式锁&#xff1a;应对分布式环境的同步挑战 &#xff08;二&#xff09;分布式锁的实现方式 &#xff08;三&#xff09;分布式锁的使用场景 &#xff08;四&#xff09;分布式锁需满足的特点 二、Redis 实现分…

Golang | Leetcode Golang题解之第363题矩形区域不超过K的最大数值和

题目&#xff1a; 题解&#xff1a; import "math/rand"type node struct {ch [2]*nodepriority intval int }func (o *node) cmp(b int) int {switch {case b < o.val:return 0case b > o.val:return 1default:return -1} }func (o *node) rotate…

算法日记day 44(动归之编辑距离|回文字串|最长回文子序列)

一、编辑距离 题目&#xff1a; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "…

WEB渗透免杀篇-cshot远程shellcode

往期文章 WEB渗透免杀篇-免杀工具全集-CSDN博客 WEB渗透免杀篇-加载器免杀-CSDN博客 WEB渗透免杀篇-分块免杀-CSDN博客 WEB渗透免杀篇-Powershell免杀-CSDN博客 WEB渗透免杀篇-Python源码免杀-CSDN博客 WEB渗透免杀篇-C#源码免杀-CSDN博客 WEB渗透免杀篇-MSFshellcode免杀…

基于.net技术的物业管理系统需求分析与设计

系统需求分析 2.1 整体需求概述 根据某XXXXXXXX管理公司实际业务调研分析&#xff0c;可将其系统需求划分为7个部分&#xff1a;基础信息维护、网上报修、权限管理、动力消耗、物料管理、收费管理、报表分析。 2.1.1 基础信息维护 基础信息维护包括对以下业务基础数据的采集…

linux驱动——设备树

1&#xff1a;初识设备树 1.1 什么是设备树&#xff0c;设备树的意义 设备树&#xff08;Device Tree&#xff09;是 Linux 内核中用于描述硬件设备的一种数据结构。它为操作系统提供了一种抽象的方法&#xff0c;使其能够识别和配置硬件设备&#xff0c;而无需将硬件细节硬编…

QT-五子棋游戏

QT-五子棋游戏 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "GameModel.h" #include <time.h> #include <stdlib.h>GameModel::GameModel(){}void GameModel::startGame(GameType type){gameType type;//初始化棋盤game…

【备忘录模式】设计模式系列:掌握状态回溯的艺术(设计详解)

文章目录 备忘录设计模式详解引言1. 设计模式概述2. 备忘录模式的基本概念2.1 备忘录模式的定义2.2 备忘录模式的关键角色 3. 备忘录模式的实现原理3.1 备忘录模式的工作流程3.2 模式的优缺点分析3.3 与其他模式的对比 4. 实际案例分析4.1 游戏状态保存与恢复4.2 文档编辑器撤销…

19529 照明灯安装

### 详细分析 这个问题可以通过二分查找和贪心算法来解决。我们需要找到一个最大值&#xff0c;使得在这个最大值下&#xff0c;能够在给定的坐标上安装 k 个照明灯&#xff0c;并且相邻的照明灯之间的距离至少为这个最大值。 ### 思路 1. **排序**&#xff1a;首先对给定的…

S3C2440中断处理

一、中断处理机制概述 中断是CPU在执行程序过程中&#xff0c;遇到急需处理的事件时&#xff0c;暂时停止当前程序的执行&#xff0c;转而执行处理该事件的中断服务程序&#xff0c;并在处理完毕后返回原程序继续执行的过程。S3C2440提供了丰富的中断源&#xff0c;包括内部中…