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

embedded/2024/9/23 10:19:42/

偏差与方差

  • 题目
  • 欠拟合
  • 改进欠拟合
    • 影响偏差和方差因素
    • 训练集拟合情况
    • 训练集和测试集代价函数
    • 选择最优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:]*lamdareturn (cost+reg)/(2*len(x))def reg_gradient(theta,x,y,lamda):grad=(x@theta-y.flatten())@xreg=lamda*thetareg[0]=0return (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 xpower=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 minimizedef 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:]*lamdareturn (cost+reg)/(2*len(x))
def reg_gradient(theta,x,y,lamda):grad=(x@theta-y.flatten())@xreg=lamda*thetareg[0]=0return (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.ppmy.cn/embedded/100248.html

相关文章

javascript如何创建函数

javascript创建函数的语法格式是 function 函数名(形参1&#xff0c;形参2&#xff0c;形参n) { 函数执行语句 } 实例代码如下 <body> <script> function sum(a,b) {var cabreturn c } var reault reaultsum(1,2) document.write(reault) </script> &l…

微信小程序如何写一个长按保存图片的功能

在微信小程序中实现长按保存图片的功能&#xff0c;通常可以通过监听图片的longpress&#xff08;长按&#xff09;事件来实现。当用户长按图片时&#xff0c;触发一个函数来执行保存图片的逻辑。不过&#xff0c;需要注意的是&#xff0c;微信小程序本身并不直接提供保存图片到…

rapidjson的移植

因为rapidjson是只有头文件 使用模板来实现json 所以只需要添加头文件就行 make使用-I/路径指定头文件 解压后编写makefile 下载地址 https://github.com/Tencent/rapidjson https://github.com/Tencent/rapidjson/releases/tag/v1.1.0 下载了版本 rapidjson-1.1.0.zip 使用…

【通俗易懂】限流、降级、熔断有什么区别?

目录 一、限流 1.1 简介 1.2 限流算法 二、降级 2.1 简介 2.2 降级的方式 延迟服务 在粒度范围内关闭服务&#xff08;片段降级或服务功能降级&#xff09; 页面异步请求降级 写降级 读降级 2.3 降级的介入方式 自动开关降级 服务超时 失败次数 发生故障 限流…

ThreadLocal解惑

目录 1、ThreadLocal是什么? 2、ThreadLocal实现原理 3、设置线程变量的2种方式 4、关于ThreadLocal的内存泄漏问题 5、使用过程中的注意事项和误区 1、ThreadLocal是什么? 比较书面的回答&#xff1a; 类如其名&#xff0c;线程本地变量。当使用 ThreadLocal 维护变量时…

sqlite3 多线程和锁 ,优化插入速度及性能优化

一、 是否支持多线程&#xff1f; SQLite官网上的“Is SQLite threadsafe?”这个问答。 简单来说&#xff0c;从3.3.1版本开始&#xff0c;它就是线程安全的了。而iOS的SQLite版本没有低于这个版本的&#xff0c;当然&#xff0c;你也可以自己编译最新版本。 不过这个线程安全…

黑神话悟空无法登录服务器怎么办

黑神话悟空游戏在登录的时候会遇到无法登录服务器的问题&#xff0c;玩家可以采用一些有效的方法进行解决&#xff0c;其中最主要的措施就是优化网络环境和减少网络干扰。Rak小编为您整理黑神话悟空无法登录服务器如何解决的步骤及注意事项。 优化网络环境 1、当游戏无法登录服…

使用 PowerShell 自动化 Windows 系统管理任务

随着信息技术的迅速发展&#xff0c;系统管理任务的复杂性和重复性显著提高。作为 Windows 系统中的强大工具&#xff0c;PowerShell 不仅提供了命令行方式进行系统管理&#xff0c;还支持脚本编写来实现自动化&#xff0c;从而有效提高工作效率并减少人为错误。本文将深入探讨…