吴恩达老师机器学习-ex5

news2024/11/24 15:34:01

有借鉴网上部分博客

首先,我先使用该数据集,通过线性回归的方法,做了一个预测问题

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

#读取数据
path = "./ex5data1.mat"
data = sio.loadmat(path)
# print(type(data))
# print(data.keys())

X = data.get("X")
y = data.get("y")
Xval = data.get("Xval")
yval = data.get("yval")
Xtest = data.get("Xtest")
ytest = data.get("ytest")
X = np.insert(X,0,values=1,axis=1)
Xval = np.insert(Xval,0,values=1,axis=1)
Xtest = np.insert(Xtest,0,values=1,axis=1)
# theta = np.zeros((2,1))
# print(X.shape)
# print(y.shape)

#可视化数据
fig,ax = plt.subplots()
ax.scatter(X[:,1:],y)
ax.set_xlabel('water level')
ax.set_ylabel('water flowing out')
plt.show()

#代价函数
def cost_func(theta,X,y,lamda):
    m = len(X)
    cost = np.sum(np.power((X @ theta - y.flatten()),2))/(2*m)
    reg = lamda * np.sum(np.power(theta[1:],2))/(2*m)
    return cost+reg

#梯度函数
def gradient_descent(theta,X,y,lamda):
    m = len(X)
    grad = (X @ theta - y.flatten()) @ X / m
    reg = lamda * theta / m
    return grad + reg
lamda = 0
#优化
def train_final(X,y,lamda):
    theta = np.ones(X.shape[1])
    fmin = minimize(fun=cost_func,
                    x0=theta,
                    args=(X, y, lamda),
                    method='TNC',
                    jac=gradient_descent)
    return fmin.x

theta_final = train_final(X,y,lamda)
print(theta_final)

#拟合图像
fig,ax = plt.subplots()
ax.scatter(X[:,1:],y)
ax.set_xlabel('water level')
ax.set_ylabel('water flowing out')
plt.plot(X[:,1:],X @ theta_final)
plt.show()

在这一部分,先读取数据,进行可视化,然后写出对应的代价函数和梯度函数,调用minimize进行优化,得到最佳的参数。

---------------------------------------------------------------------------------------------------------------------------------

拟合完函数,发现效果并不好,所以画出学习曲线分析问题

#绘画学习曲线
def learning_curve(X,y,Xval,yval,lamda):
    train_cost = []
    val_cost = []
    x = range(1,len(X+1))
    for i in x:
        theta_i = train_final(X[:i,:],y[:i,:],lamda)
        train_cost_i = cost_func(theta_i,X[:i,:],y[:i,:],lamda)
        val_cost_i = cost_func(theta_i,Xval,yval,lamda)
        train_cost.append(train_cost_i)
        val_cost.append(val_cost_i)
    plt.plot(x,train_cost,label="train_cost")
    plt.plot(x,val_cost,label="val_cost")
    plt.xlabel('number of training examples')
    plt.ylabel('costs')
    plt.show()
learning_curve(X,y,Xval,yval,lamda)

发现训练误差和验证误差都比较大,并且到后面趋于水平。分析可能是欠拟合问题。

因此,我选择增加特征次数的方法,也就是使特征项变多,最后得到一个比较不错的拟合函数。

#特征映射
def feature_mapping(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 normalization(X):
    mean = np.mean(X,axis=0)
    stds = np.std(X, axis=0)
    X[:, 1:] = (X[:, 1:] - mean[1:]) / stds[1:]
    return X

power = 6

X_train_poly = feature_mapping(X,power)
X_val_poly = feature_mapping(Xval,power)
X_test_poly = feature_mapping(Xtest,power)

X_train_norm = normalization(X_train_poly)
X_val_norm = normalization(X_val_poly)
X_test_norm = normalization(X_test_poly)

theta_final_map = train_final(X_train_norm,y,lamda=0)
print(theta_final_map)
#拟合
fig,ax = plt.subplots()
ax.scatter(X[:,1:],y)
ax.set_xlabel('water level')  # 设置坐标轴标签
ax.set_ylabel('water flowing out')

x = np.linspace(-60,60,100)
xReshape = x.reshape(100,1)
xReshape  = np.insert(xReshape ,0,values=1,axis=1)
xReshape = feature_mapping(xReshape ,power)
xReshape  = normalization(xReshape )
plt.plot(x, xReshape  @ theta_final_map,c="r")
plt.show()

最后,我们需要选择合适的lamda,这里使用验证集选择。也就是说使用训练集得到合适的参数theta,使用验证集得到合适的参数lamda。

#选择lamda
lamdas = [0, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, 3, 10]
train_cost = []
val_cost = []
for lamda in lamdas:
    theta_lamda = train_final(X_train_norm,y,lamda)
    train_cost_lamda = cost_func(theta_lamda,X_train_norm,y,lamda=0)
    vai_cost_lamda = cost_func(theta_lamda,X_val_norm,yval,lamda=0)
    train_cost.append(train_cost_lamda)
    val_cost.append(vai_cost_lamda)

plt.plot(lamdas,train_cost,label="train_cost")
plt.plot(lamdas,val_cost,label="val_cost")
plt.show()

然后,我们得到的最佳的lamda

# 最佳lamda
bestLamda = lamdas[np.argmin(val_cost)]
print(bestLamda) 
# 训练测试集
res = train_final(X_train_norm, y, bestLamda)
print(cost_func(res, X_test_norm, ytest, lamda=0)) 

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

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

相关文章

Spine 核心功能入门

核心功能入门 本文主旨是整理我在入手学习 spine 时的流程,以及对于基本功能的理解和常规 2D 动画实现的思路。 意在整理出一个简要的入门 spine 的流程,以及对于一些高阶功能的应用的思考。 本文基于 https://zh.esotericsoftware.com/ 官网教程进行思…

2024.8.1 作业

使用两个线程完成两个文件的拷贝&#xff0c;分支线程1拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程回收两个分支线程的资源 #include <myhead.h>struct Buf {const char *file1;const char *file2;int start;int size; };int get_len(const char *arr…

从线段中搜寻提取闭合轮廓(二)

接上篇文章从线段中搜寻闭合轮廓_多线段搜索区域集合 快速-CSDN博客 1. 前言 调试了上篇文章中参考代码修了一些问题&#xff0c;优化了显示&#xff0c;但是由于算法逻辑存在一些问题&#xff0c;有很多不必要的性能损耗&#xff0c;且逻辑不是最优的&#xff0c;于是博主找…

FPGA开发——蜂鸣器实现音乐播放器的设计

一、概述 我们在进行蜂鸣器的学习的时候&#xff0c;总会在想既然蜂鸣器能够发出声音&#xff0c;那么它能够播放音乐吗&#xff0c;今天这篇我们文章我们就一起来学习怎样使用使用蜂鸣器来播放音乐&#xff0c;也就是怎样成为一个音乐播放器。 1、蜂鸣器的类型 在设计的时候…

玩机进阶教程-----手机恢复出厂 误删除照片视频 误刷机后 几种数据恢复操作步骤解析【一】

手机中存储有众多的照片 视频 文件或者电话本这类的数据,虽然目前很多机型都有云存储。可以随时同步手机的存储数据。但万一云存储没有开启同步或者密码忘记。或者恢复出厂等等原因造成以上的数据丢失。或者手机系统问题导致的不开机但需要其中的数据等等。那么如何简单快速的…

【项目日记(五)】梦幻笔耕-测试报告

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多项目内容 目录 1.项目背景2.测试环境3.测试计划3.1功能测试3.2自动化测试 1.项目背景 个人博客系统…

剪画小程序:自媒体创业者的准备-文案!

作为一个刚刚踏入自媒体领域的新人&#xff0c;我满怀着激情和憧憬&#xff0c;渴望通过视频分享自己的见解和生活点滴。然而&#xff0c;视频文案的创作却成了我面前难以逾越的高山。 在构思旅行视频时&#xff0c;面对美丽的风景和丰富的经历&#xff0c;我却无法用恰当的文字…

嵌入式学习Day19---Linux软件编程

目录 一、标准I/O 1.1.fseek 1.偏移量 2.实例 ​编辑 1.2.ftell 2.实例 ​编辑 二、文件I/O 2.1.打开文件 1.open 2.2.实例 2.2.读写文件 1.write 实例 ​编辑 2.read 实例 2.3.关闭文件 1.close 2.3.lseek 实例 三、标准I/O与文件I/O的区别 3.1.区别 四、其…

2024年有哪些开放式耳机值得入手?精选五大高分品牌

近几年兴起的开放式蓝牙耳机&#xff0c;具有佩戴舒适稳固、不影响使用者判断外界环境等优点&#xff0c;十分适合在户外环境下使用&#xff0c;因此受到了众多健身人士的喜爱。那么该如何挑选到一款适合自己的开放式耳机呢&#xff1f;2024年有哪些开放式耳机值得入手&#xf…

【架构】应用保护

这篇文章总结一下应用保护的手段。如今说到应用保护&#xff0c;更多的会想到阿里的sentinel&#xff0c;手段丰富&#xff0c;应用简单。sentinel的限流、降级、熔断&#xff0c;可以自己去试一下&#xff0c;sentinel主要通过配置实现功能&#xff0c;不难。sentinel的简介放…

Qt如何在工程中使用dll库

DEMO&#xff1a;Test &#xff1b;工程与dll皆为qmake编译&#xff1b; 所需文件&#xff1a;A.dll、A.lib、A.h、A_global.h&#xff1b;B.dll。其中A.dll 依赖 B.dll 1. 环境配置 &#xff08;1&#xff09;确认制作dll的Qt版本和当前工程版本是否一致(Qt6中的一些函数Qt…

SLAM中的概率基础(知识回顾)

今天有些知识点忘记了&#xff0c;特地过来回顾一下&#xff0c;于是就做了这些笔记。 为了方便能够在手机上更直观的看笔记&#xff0c;写下这篇文章&#xff0c;有错误请各位大佬指出。 一、 概率基础概念 1.1. 概率密度函数&#xff08;PDF&#xff09; 概率密度函数用于…

第十九次(安装nginx代理tomcat)

回顾 1.安装nodejs---jdk一样你的软件运行环境 yum -y list install|grep epel $? yum -y install nodejs #版本号 node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config ...淘宝镜像 3.安装vue/cli command line interface 命令行接口 npm ins…

推荐4个国内可用的AI软件,用上以后都能早点下班

随着技术的发展&#xff0c;越来越多的AI软件出现在人们的视野&#xff0c;应用的领域更多&#xff0c;能力提升也更快&#xff0c;用在工作上能帮不少忙。下面就给大家分享4个国内可以直接使用的AI软件&#xff0c;希望大家啊用上以后都能早点下班~ 1.Kimi 一键直达>>h…

韶音开放式耳机怎么样?韶音、西圣、QCY热门款实测横评

开放式耳机是目前最火爆的的耳机市场细分赛道&#xff0c;开放式耳机的优点包括健康卫生&#xff0c;佩戴舒适性高&#xff0c;方便我们接收外部环境音等等&#xff0c;以上这些优势使得开放式耳机特别适配户外运动场景&#xff0c;在工作、日常生活等场景下使用也是绰绰有余。…

Day81 代码随想录打卡|贪心算法篇---跳跃游戏 II

题目&#xff08;leecode T45&#xff09;&#xff1a;给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j…

亚马逊新产品怎么快速提升销量

经常有卖家吐槽新产品没销量&#xff0c;但卖家们的吐槽并不能把问题解决&#xff0c;南哥和大家分享一下关于测评的好处和一些技巧&#xff0c;以及如何样做才能提高店铺销量&#xff0c;将运营和测评结合起来做 测评的好处: 提升店铺信誉&#xff0c;制造爆款&#xff0c;增…

DjangoRF-12-创建testcases子应用--测试套件模块

models–serializers-permission-views-urls 1、创建models&#xff0c; class TestSuit(BaseModel): name models.CharField(测试套件名称, max_length200, help_text测试套件名称) task models.ForeignKey(Task, verbose_name测试任务, on_deletemodels.PROTECT,help_tex…

揭秘MITM攻击:原理、手法与防范措施

中间人攻击发生时&#xff0c;攻击者会在通讯两端之间插入自己&#xff0c;成为通信链路的一部分。攻击者可以拦截、查看、修改甚至重新定向受害者之间的通信数据&#xff0c;而不被双方察觉。这种攻击常见于未加密的Wi-Fi网络、不安全的HTTP连接或者通过社会工程学手段诱导受害…

C++基础语法:函数探幽(一)内联函数,默认参数,函数重载

前言 "打牢基础,万事不愁" .C的基础语法的学习."学以致用,边学边用",编程是实践性很强的技术,在运用中理解,总结. 引入 <C Prime Plus> 6th Edition(以下称"本书")第8章内容解读 内联函数 1>本书P253--8.1节C内联函数第二…