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

2024-08-22 04:44

本文主要是介绍吴恩达机器学习课后题-02逻辑回归,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

逻辑回归

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

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

在这里插入图片描述

在这里插入图片描述

Cost function(代价函数)

在这里插入图片描述

在这里插入图片描述

梯度下降

在这里插入图片描述

题目

线性可分

在这里插入图片描述

散点图

#线性可分
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltdata=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.valuesy = y.valuesreturn 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,costsdef 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_x1ax.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 pltdata=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.valuesy = y.valuesreturn 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()

在这里插入图片描述

这篇关于吴恩达机器学习课后题-02逻辑回归的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095275

相关文章

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss