吴恩达机器学习课后作业-05偏差与方差

news2024/9/23 15:29:52

偏差与方差

  • 题目
  • 欠拟合
  • 改进欠拟合
    • 影响偏差和方差因素
    • 训练集拟合情况
    • 训练集和测试集代价函数
    • 选择最优lamda
  • 整体代码

在这里插入图片描述

训练集:训练模型

·验证集︰模型选择,模型的最终优化

·测试集:利用训练好的模型测试其泛化能力


#训练集
x_train,y_train = data['X'],data[ 'y']

#验证集
x_val,y_val = data['Xval'],data[ 'yval']
x_val.shape,y_val.shape

#测试集
x_test,y_test = data['Xtest'],data[ 'ytest']
x_test.shape,y_test.shape

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



def reg_cost(theta,x,y,lamda):
    cost=np.sum(np.power(x@theta-y.flatten(),2))
    reg=theta[1:]@theta[1:]*lamda
    return (cost+reg)/(2*len(x))
   
def reg_gradient(theta,x,y,lamda):
    grad=(x@theta-y.flatten())@x
    reg=lamda*theta
    reg[0]=0
    return (grad+reg)/(len(x))

def train_mode(x,y,lamda):
    theta=np.ones(x.shape[1])
    res=minimize(
        fun=reg_cost,
        x0=theta,
        args=(x,y,lamda),
        method='TNC',
        jac=reg_gradient
    )
    return res.x

欠拟合

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


"""
训练样本从1开始递增进行训练
比较训练集和验证集上的损失函数的变化情况
"""
def plot_learning_curve(x_train,y_train,x_val,y_val,lamda):
    x= range(1,len(x_train)+1)
    training_cost =[]
    cv_cost =[]
    for i in x:
        res = train_mode(x_train[:i,:],y_train[:i,:],lamda)
        training_cost_i = reg_cost(res,x_train[:i,:],y_train[:i,:],lamda)
        cv_cost_i = reg_cost(res,x_val,y_val,lamda)
        training_cost.append(training_cost_i)
        cv_cost.append(cv_cost_i)
    plt.plot(x,training_cost,label = 'training cost')
    plt.plot(x,cv_cost,label = 'cv cost')
    plt.legend()
    plt.xlabel("number of training examples")
    plt.ylabel("error")
    plt.show()



改进欠拟合

影响偏差和方差因素

在这里插入图片描述
在这里插入图片描述


"""
任务:构造多项式特征,进行多项式回归
"""

def poly_feature(x, power):
    for i in range(2, power + 1):
        x= np.insert(x, x.shape[1], np.power(x[:, 1], i), axis = 1)
    return x
"""
归一化
"""
def get_means_stds(x):
    means = np.mean(x, axis=0)
    stds = np.std(x, axis=0)
    return means, stds
def feature_normalize(x,means,stds):
    x [:,1:]=(x[:,1:] - means[1:,])/stds[1:]
    return x



power=6
x_train_poly=poly_feature(x_train,power)
x_val_poly=poly_feature(x_val,power)
x_test_poly=poly_feature(x_test,power)
train_means,train_stds=get_means_stds(x_train_poly)
x_train_norm=feature_normalize(x_train_poly,train_means,train_stds)
x_val_norm=feature_normalize(x_val_poly,train_means,train_stds)
x_test_norm=feature_normalize(x_test_poly,train_means,train_stds)
theta_fit=train_mode(x_train_norm,y_train,lamda =0)

训练集拟合情况

"""
训练集
绘制数据集和拟合函数
"""
def plot_poly_fit():
    plot_data()
    x = np.linspace(-60,60,100)
    xx= x.reshape(100,1)
    xx= np.insert(xx,0,1,axis=1)
    xx= poly_feature(xx,power)
    xx= feature_normalize(xx,train_means,train_stds)
    plt.plot(x,xx@theta_fit,'r--')

在这里插入图片描述

训练集和测试集代价函数

plot_learning_curve(x_train_norm,y_train, x_val_norm, y_val, lamda=0)
此时lamda=0没有加入正则化

在这里插入图片描述
可以看出是高方差,过拟合了,此时lamda=0没有加入正则化
加入正则化如下

plot_learning_curve(x_train_norm,y_train, x_val_norm, y_val, lamda=1)

在这里插入图片描述
此时训练集误差增大,验证集误差减小了
但是lamda不能过大了,如下

plot_learning_curve(x_train_norm,y_train, x_val_norm, y_val, lamda=100)

在这里插入图片描述

选择最优lamda

lamdas=[0,0.001,0.003,0.01,0.03,0.1,0.3,1,2,3,10]
training_cost =[]
cv_cost =[]
for lamda in lamdas:
    res = train_mode(x_train_norm,y_train,lamda)
    tc = reg_cost(res,x_train_norm,y_train,lamda=0)
    cv = reg_cost(res,x_val_norm,y_val,lamda=0)
    training_cost.append(tc)
    cv_cost.append(cv)
plt.plot(lamdas,training_cost,label="training cost")
plt.plot(lamdas,cv_cost,label="cv cos")
plt.legend()
plt.show()

在这里插入图片描述

l=lamdas[np.argmin(cv_cost)]#寻找最优lamda
print(l)
res = train_mode(x_train_norm,y_train,lamda =l)
test_cost = reg_cost(res,x_test_norm,y_test,lamda = 0)
print(test_cost)

整体代码

import numpy as np
import matplotlib.pyplot as plt
import scipy.io as sio
from scipy.optimize import minimize

def plot_data():
    fig,ax = plt.subplots()
    ax.scatter(x_train[:,1],y_train)
    ax.set(xlabel = "change in water level(x)",
    ylabel = 'water flowing out og the dam(y)')


def reg_cost(theta,x,y,lamda):
    cost=np.sum(np.power(x@theta-y.flatten(),2))
    reg=theta[1:]@theta[1:]*lamda
    return (cost+reg)/(2*len(x))
def reg_gradient(theta,x,y,lamda):
    grad=(x@theta-y.flatten())@x
    reg=lamda*theta
    reg[0]=0
    return (grad+reg)/(len(x))

def train_mode(x,y,lamda):
    theta=np.ones(x.shape[1])
    res=minimize(
        fun=reg_cost,
        x0=theta,
        args=(x,y,lamda),
        method='TNC',
        jac=reg_gradient
    )
    return res.x

"""
训练样本从1开始递增进行训练
比较训练集和验证集上的损失函数的变化情况
"""
def plot_learning_curve(x_train,y_train,x_val,y_val,lamda):
    x= range(1,len(x_train)+1)
    training_cost =[]
    cv_cost =[]
    for i in x:
        res = train_mode(x_train[:i,:],y_train[:i,:],lamda)
        training_cost_i = reg_cost(res,x_train[:i,:],y_train[:i,:],lamda)
        cv_cost_i = reg_cost(res,x_val,y_val,lamda)
        training_cost.append(training_cost_i)
        cv_cost.append(cv_cost_i)
    plt.plot(x,training_cost,label = 'training cost')
    plt.plot(x,cv_cost,label = 'cv cost')
    plt.legend()
    plt.xlabel("number of training examples")
    plt.ylabel("error")
    plt.show()



"""
任务:构造多项式特征,进行多项式回归
"""

def poly_feature(x, power):
    for i in range(2, power + 1):
        x= np.insert(x, x.shape[1], np.power(x[:, 1], i), axis = 1)
    return x
"""
归一化
"""
def get_means_stds(x):
    means = np.mean(x, axis=0)
    stds = np.std(x, axis=0)
    return means, stds
def feature_normalize(x,means,stds):
    x [:,1:]=(x[:,1:] - means[1:,])/stds[1:]
    return x
"""
训练集
绘制数据集和拟合函数
"""
def plot_poly_fit():
    plot_data()
    x = np.linspace(-60,60,100)
    xx= x.reshape(100,1)
    xx= np.insert(xx,0,1,axis=1)
    xx= poly_feature(xx,power)
    xx= feature_normalize(xx,train_means,train_stds)
    plt.plot(x,xx@theta_fit,'r--')



data=sio.loadmat("E:/学习/研究生阶段/python-learning/吴恩达机器学习课后作业/code/ex5-bias vs variance/ex5data1.mat")


#训练集
x_train,y_train = data['X'],data[ 'y']

#验证集
x_val,y_val = data['Xval'],data[ 'yval']
x_val.shape,y_val.shape

#测试集
x_test,y_test = data['Xtest'],data[ 'ytest']
x_test.shape,y_test.shape
#
x_train = np.insert(x_train,0,1,axis=1)
x_val = np.insert(x_val,0,1,axis=1)
x_test = np.insert(x_test,0,1,axis=1)
# plot_data()
theta=np.ones(x_train.shape[1])
lamda=1
# print(reg_cost(theta,x_train,y_train,lamda))
#print(reg_gradient(theta,x_train,y_train,lamda))
# theta_final=train_mode(x_train,y_train,lamda=0)
# plot_data()
# plt.plot(x_train[:,1],x_train@theta_final,c='r')
# plt.show()

#plot_learning_curve(x_train,y_train, x_val, y_val, lamda)
power=6
x_train_poly=poly_feature(x_train,power)
x_val_poly=poly_feature(x_val,power)
x_test_poly=poly_feature(x_test,power)
train_means,train_stds=get_means_stds(x_train_poly)
x_train_norm=feature_normalize(x_train_poly,train_means,train_stds)
x_val_norm=feature_normalize(x_val_poly,train_means,train_stds)
x_test_norm=feature_normalize(x_test_poly,train_means,train_stds)
theta_fit=train_mode(x_train_norm,y_train,lamda =0)
# plot_poly_fit()
#plot_learning_curve(x_train_norm,y_train, x_val_norm, y_val, lamda=100)
lamdas=[0,0.001,0.003,0.01,0.03,0.1,0.3,1,2,3,10]
training_cost =[]
cv_cost =[]
for lamda in lamdas:
    res = train_mode(x_train_norm,y_train,lamda)
    tc = reg_cost(res,x_train_norm,y_train,lamda=0)
    cv = reg_cost(res,x_val_norm,y_val,lamda=0)
    training_cost.append(tc)
    cv_cost.append(cv)
plt.plot(lamdas,training_cost,label="training cost")
plt.plot(lamdas,cv_cost,label="cv cos")
plt.legend()
plt.show()
l=lamdas[np.argmin(cv_cost)]#寻找最优lamda
print(l)
res = train_mode(x_train_norm,y_train,lamda =l)
test_cost = reg_cost(res,x_test_norm,y_test,lamda = 0)
print(test_cost)

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

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

相关文章

【C++ Primer Plus习题】4.9

问题: 解答: #include <iostream> using namespace std;typedef struct _CandyBar {string brand;float weight;int calorie; }CandyBar;int main() {CandyBar* snack new CandyBar[3];snack[0] {"德芙",2.1,20};snack[1] { "箭牌",2.2,16 };sna…

鸿蒙(API 12 Beta3版)【使用Image完成图片编码】图片开发指导依赖JS对象

开发者可以调用本模块的Native API接口&#xff0c;完成图片编码&#xff0c;即将PixelMap压缩成不同格式的存档图片。 当前支持编码为JPEG、WebP 和 PNG 格式。 适用场景 图片编码转换。 通过传入图片源ImageSource&#xff0c;封装成想要的格式。 图片编辑 编辑PixelMap后…

【C# 】使用List<实体类>

1. 使用List<实体类> 要在C#中使用List<EntityTemp>并实现查找数据输出&#xff0c;首先需要定义EntityTemp类&#xff0c;并创建一个List<EntityTemp>类型的列表。然后&#xff0c;你可以使用LINQ或其他方法来查找和输出数据。 假设EntityTemp类具有一个…

最新最全的Pytest接口自动化测试框架教程

pytest编写的规则&#xff1a; 1、测试文件以test_开头&#xff08;以_test结尾也可以&#xff09; 2、测试类以Test开头&#xff0c;并且不能带有__init__方法 3、测试函数以test_开头 4、断言必须使用assert pytest.main([-s,-v]) &#xff1a;用来执行测试用例 -s 打印prin…

pcdn闲置带宽被动收入必看教程。第六讲:交换机配置实战篇

pcdn闲置带宽被动收入必看教程。第六讲&#xff1a;交换机配置实战篇 本章节将介绍如何通过简单的步骤配置交换机&#xff0c;以汇聚所有宽带并集中管理速率&#xff0c;最终接入服务器或软路由&#xff0c;实现远程管理分配速率给具体的服务器或小主机等。 交换机配置步骤 1…

Redis:Redis为什么快

文章目录 一、Redis为什么快二、Redis的单线程模型三、高效的数据结构1、跳表 四、内存的高效使用五、I/O多路复用机制六、网络优化 一、Redis为什么快 单机的Redis每秒可以支撑十几万的并发&#xff0c;相对于MySQL来说&#xff0c;性能是MySQL的十几倍。速度快主要有一下因素…

Docker快速上手

Docker 前言一、基本组成二、常用命令2.1 Docker服务2.2 image相关命令2.3 Container相关命令 三、Docker Volume 容器卷3.1 匿名挂载3.2 具名挂载 四、Docker 网络模式4.1 bridge桥接模式4.2 host主机模式4.3 None模式4.4 Container模式4.5 Customer模式 前言 本篇文章不再赘…

2024计算机技术与软件专业技术资格考试-系统规划与管理(高级)

2024年报名时间&#xff1a;2024年8月22日10:00-9月2日16:00 2024年考试时间&#xff1a;2024年11月9日-11月12日 计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试是原中国计算机软件专业技术资格和水平考试&#xff08;简称软件考试&#xff09;的完善与发展。…

windows 10x64 22H2专业纯净版2028.8.24

Windows 10 22H2专业版19045.3208&#xff0c;据传这版最稳定&#xff0c;速度快。原版制作&#xff0c;打齐KB5028166和服务堆栈更新KB5028318补丁。 禁用了系统升级&#xff0c;删除Windows Defender&#xff0c;禁用打印机服务&#xff0c;需要安装打印机的自行打开服务Prin…

逆序对的数量——归并排序

逆序对的数量 归并排序的解法&#xff0c;今天自己拿前台样例模拟了一遍才算是入门了归并排序的感觉 #include<bits/stdc.h>using namespace std; typedef long long ll; const int N1e510; int a[N]; int temp[N]; int k;ll mergesort(int q[],int l,int r) {if(l>r)…

string类的使用与实现

标准库中的string类 string类(了解) string类的文档介绍 注意&#xff1a;在使用string类时&#xff0c;必须包含#include头文件以及using namespace std; auto和范围for 在了解string的用法前在学习一个知识&#xff1b; auto关键字 auto是作为一个新的类型指示符来指示编译器…

若依AjaxResult的get(AjaxResult.CODE_TAG)有时返回的200,有时返回的字符串“200“

这个项目是多模块项目&#xff0c;之前通过web json格式&#xff0c;多模块之前传输用的RestTemplate&#xff0c;但是对接其它系统时要用XML就添加了XML的依赖。 原来 原来ajaxResult.get(AjaxResult.CODE_TAG).equals(200)能返回true&#xff0c; 现在get(AjaxResult.CODE…

3.2.6 盘古开天地start_kernel

点击查看系列文章 》 Interrupt Pipeline系列文章大纲-CSDN博客 3.2 内核初始化(盘古开天地) 3.2.1 内核初始化的神话 3.2.2 从头 (Head)开始 3.2.3 从头初始化到身体 3.2.4 宇之内存的空分复用 3.2.5 宙之CPU的时分复用 3.2.6 盘古开天地start_kernel 3.2.6 盘古开天地start_…

abc 366 E+F(曼哈顿距离 x y 两个坐标分别计算)(贪心+01背包)

E题&#xff1a; 题意&#xff1a;给定的 xi yi 。求有多少点 到给人 若干定点 的曼哈顿距离 和 小于等于D. 因为D 最大时 1e6,-1e6<xi<1e6。 所以 可能的 点 的 x 的范围是 [-2e6 2e6] 同理 y 的 范围 一样。 将 x y 分开讨论。 我们可以枚举 某个x 的 个数&#xff0…

聚类:k-Means 和 k-Medoid

1. 前言 在《对静态分析缺陷报告进行聚类&#xff0c;以降低维护成本》 提到使用 k-Medoid 通过相似缺陷的聚类&#xff0c;来减少程序员对大量缺陷分析的工作量。 k-Medoid 和传统的 k-Means 聚类算法有什么差别呢&#xff1f; 简单的说&#xff0c;K-Medoid 算法是一种基于…

golang RSA 解密前端jsencrypt发送的数据时异常 crypto/rsa: decryption error 解决方法

golang中 RSA解密前端&#xff08;jsencrypt&#xff09;发来的密文后出现 "crypto/rsa: decryption error" &#xff0c; 这个问题首先需要确认你的私匙和公匙是否匹配&#xff0c; 如果匹配 那检查入参数据类型&#xff0c; 前端发送来的rsa加密后的数据一般都是…

《黑神话:悟空》到底是用什么语言开发的

《黑神话&#xff1a;悟空》&#xff08;Black Myth: Wukong&#xff09;是一款由中国游戏开发公司游戏科学&#xff08;Game Science&#xff09;开发的动作角色扮演游戏。该游戏主要使用了以下技术栈&#xff1a; 开发引擎&#xff1a;游戏科学公司使用了**虚幻引擎5&#x…

blender--二维平面图标变为三维网格

有时候我们希望把一些二维图片能变成三维网格&#xff0c;本案例我们就针对这一场景进行实现。 首先我们可以先去找一张需要的图片(注意&#xff0c;本例需要图片是svg格式)&#xff0c;我们可以在阿里巴巴矢量图标库等平台进行搜索&#xff0c;如图所示&#xff0c;找到需要的…

Python优化算法12——蝴蝶优化算法(BOA)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考&#xff1a;Python优化算…

ProtoBuf简要介绍与快速上手使用(C++版)

文章目录 一、 初识ProtoBuf1. 序列化和反序列化概念2. ProtoBuf是什么3. ProtoBuf的使用特点 二、 讲解说明三、 快速上手1. 创建 .proto 文件2. 编译 contacts.proto 文件&#xff0c;生成C文件3. 序列化与反序列化的使用4. 小结 ProtoBuf 使用流程 一、 初识ProtoBuf 1. 序…