机器学习基础06

news2024/11/23 4:53:13

目录

1.梯度下降

1.1梯度下降概念

1.2梯度下降公式

1.3学习率

1.4实现梯度下降

1.5API

1.5.1随机梯度下降SGD 

1.5.2小批量梯度下降MBGD

1.6梯度下降优化

2.欠拟合过拟合

2.1欠拟合

2.2过拟合

2.3正则化

2.3.1L1正则项(曼哈顿距离)

2.3.2L2正则项(欧氏距离 )

3.岭回归(Ridge)

3.1损失函数公式

3.2API 

4.拉索回归(Lasso)

4.1损失函数公式

4.2API


1.梯度下降

1.1梯度下降概念

正规方程求解的缺点

①利用正规方程求解的W是最优解的原因是MSE这个损失函数是凸函数。但机器学习的损失函数并非都是凸函数,设置导数为0会得到很多个极值,不能确定唯一解。

②当数据量和特征较多时,矩阵计算量太大.

在机器学习中,梯度表示损失函数对于模型参数的偏导数。具体来说,对于每个可训练参数,梯度告诉我们在当前参数值下,沿着每个参数方向变化时,损失函数的变化率。通过计算损失函数对参数的梯度,梯度下降算法能够根据梯度的信息来调整参数,朝着减少损失的方向更新模型。

1.2梯度下降公式

有损失函数:

梯度下降公式:

 得:

1.3学习率

设置大的学习率α;每次调整的幅度就大,设置小的学习率α;每次调整的幅度就小

 

(1)常见的设定数值:0.1、0.01、0.001、0.0001

(2)随着迭代次数增多学习率逐渐变小,深度学习的优化算法可以调整学习率

1.4实现梯度下降

import matplotlib.pyplot as plt
import numpy as np

# 随机初始化
w= np.random.randint(-10,10,1)
# 学习率
h =0.01
# 收敛条件
diff=0.0001
# 最大更新的次数
time =1000


lt_w =[]
lt_w_new=[]
for i in range(time):
    # 保存原w,用于计算差值
    w_new= w
    lt_w.append(w_new)
    lt_w_new.append(10*w**2-15.9*w+6.5)

    # 更新w
    w= w - h*(20*w_new-15.9)#20*w-15.9是切线
    difference=w_new-w
    print(f'第{i+1}次迭代:','\t','w:',w,'\t','w_new-w:', difference)
    if abs(difference) <=diff:
        break


# 图像示意,散点图为梯度下降
plt.scatter(lt_w,lt_w_new,c='red')

w = np.linspace(-10,10,100)
loss = 10*w**2-15.9*w+6.5
# 曲线图为损失函数
plt.plot(w,loss)

plt.show()

import numpy as np
import matplotlib.pyplot as plt

# 随机初始化
w1 = 10
w2 = 10

# 学习率
h = 0.001
# 收敛条件
diff = 0.0001
# 最大更新的次数
time = 1000

def loss(w1, w2):
    return 4*w1**2 + 9*w2**2 + 2*w1*w2 + 3.5*w1 - 4*w2 + 6

def dloss_w1(w1, w2):
    return 8*w1 + 2*w2 + 3.5

def dloss_w2(w1, w2):
    return 2*w1 + 18*w2 - 4

# 记录每次迭代的w1和w2
w1_history = [w1]
w2_history = [w2]

for i in range(time):
    # 保存原w,用于计算差值
    w1_new = w1
    w2_new = w2

    # 更新w
    w1 = w1 - h * dloss_w1(w1_new, w2_new)
    w2 = w2 - h * dloss_w2(w1_new, w2_new)

    difference1 = w1_new - w1
    difference2 = w2_new - w2

    print(f'第{i+1}次迭代:\tw1: {w1:.6f}, w2: {w2:.6f}, w1_new-w1: {difference1:.6f}, w2_new-w2: {difference2:.6f}')
    
    # 记录每次迭代的w1和w2
    w1_history.append(w1)
    w2_history.append(w2)

    if abs(difference1) <= diff and abs(difference2) <= diff:
        break

print("最终结果:w1 =", w1, "w2 =", w2)

# 绘制三维图
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# 创建网格数据
w1_vals = np.linspace(-15, 15, 100)
w2_vals = np.linspace(-15, 15, 100)
w1_grid, w2_grid = np.meshgrid(w1_vals, w2_vals)
loss_grid = loss(w1_grid, w2_grid)

# 绘制损失函数的表面
ax.plot_surface(w1_grid, w2_grid, loss_grid, cmap='viridis', alpha=0.7)

# 绘制梯度下降路径
ax.plot(w1_history, w2_history, [loss(w1, w2) for w1, w2 in zip(w1_history, w2_history)], color='r', marker='.')

# 设置标签
ax.set_xlabel('w1')
ax.set_ylabel('w2')
ax.set_zlabel('Loss')

# 显示图形
plt.show()

 

1.5API

批量梯度下降BGD(Batch Gradient Descent)

小批量梯度下降MBGD(Mini-BatchGradient Descent)

随机梯度下降SGD(Stochastic Gradient Descent)。

  • Batch Gradient Descent (BGD):每一次迭代都会使用全部的训练样本计算梯度来更新权重。这意味着每一步梯度更新都是基于整个数据集的平均梯度。这种方法的优点是每次更新的方向是最准确的,但缺点是计算量大且速度慢,尤其是在大数据集上。

  • Mini-Batch Gradient Descent (MBGD): 这种方法介于批量梯度下降和随机梯度下降之间。它不是用全部样本也不是只用一个样本,而是每次迭代从数据集中随机抽取一小部分样本(例如,从500个样本中选取32个),然后基于这一小批样本的平均梯度来更新权重。这种方法在准确性和计算效率之间取得了一个平衡。

  • Stochastic Gradient Descent (SGD): 在随机梯度下降中,每次迭代仅使用随机单个样本(或有时称为“例子”)来计算梯度并更新权重。这种方法能够更快地收敛,但由于每次更新都基于单个样本,所以会导致权重更新路径不稳定。

1.5.1随机梯度下降SGD 

sklearn.linear_model.SGDRegressor()

参数:
    loss: 损失函数,默认为 ’squared_error’
    fit_intercept: 是否计算偏置, default=True
    eta0: float, default=0.01学习率初始值
    learning_rate:  str, default=’invscaling’   
            ‘constant’: eta = eta0 学习率为eta0设置的值,保持不变
            ‘optimal’: eta = 1.0 / (alpha * (t + t0)) 
            ‘invscaling’: eta = eta0 / pow(t, power_t)
            ‘adaptive’: eta = eta0, 学习率由eta0开始,逐步变小
    max_iter: int,  default=1000 经过训练数据的最大次数(又名epoch)
    shuffle=True 每批次是否洗牌
    penalty: {‘l2’, ‘l1’, ‘elasticnet’, None}, default=’l2’,要使用的正则化项
属性:     
      coef_ 回归后的权重系数
      intercept_ 偏置 

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error

dataset = fetch_california_housing(data_home='./src')

x_train,x_test,y_train,y_test=train_test_split(dataset.data,dataset.target,train_size =0.7,shuffle =True,random_state=200)

transfer = StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)

# 线性回归预估器
estimator = SGDRegressor(loss='squared_error',penalty='l1',max_iter=1000,eta0=0.01,learning_rate ='constant')
estimator.fit(x_train,y_train)

# 模型数据
print('coef:',estimator.coef_)
print('intercept:',estimator.intercept_)

y_predict = estimator.predict(x_test)
print("预测的数据集:\n", y_predict)
print('决定系数 (R^2):',estimator.score(x_test,y_test))
error = mean_squared_error(y_test,y_predict)
print('均方误差:',error)

1.5.2小批量梯度下降MBGD

sklearn.linear_model.SGDRegressor()

 调用partial_fit函数训练直接更新权重,不需要调fit从头开始训练。

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error

dataset = fetch_california_housing(data_home='./src')

x_train,x_test,y_train,y_test=train_test_split(dataset.data,dataset.target,train_size =0.7,shuffle =True,random_state=200)

transfer = StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)

# 线性回归预估器
estimator = SGDRegressor(loss='squared_error',penalty='l1',max_iter=1000,eta0=0.01,learning_rate ='constant')

# 小批量梯度下降
batch_size =50 # 批量大小
n_batches = len(x_train)//batch_size 
for epoch in range(estimator.max_iter):
    # 随机打乱样本顺序
    indices = np.random.permutation(len(x_train))
    for i in range(n_batches):
        start_index = i*batch_size
        end_index = (i+1) * batch_size
        batch_indices = indices[start_index:end_index]
        x_batch = x_train[batch_indices]
        y_batch = y_train[batch_indices]
        # 更换模型权重
        estimator.partial_fit(x_batch,y_batch) 
        

# 模型数据
print('coef:',estimator.coef_)
print('intercept:',estimator.intercept_)

y_predict = estimator.predict(x_test)
print("预测的数据集:\n", y_predict)
print('决定系数 (R^2):',estimator.score(x_test,y_test))
error = mean_squared_error(y_test,y_predict)
print('均方误差:',error)

1.6梯度下降优化

(1)标准化

(2)正则化

2.欠拟合过拟合

分类问题的三种拟合状态:

回归问题的三种拟合状态:

2.1欠拟合

欠拟合是指模型在训练数据上表现不佳,同时在其他数据上也表现不佳。这通常发生在模型过于简单,无法捕捉数据中的复杂模式时。欠拟合模型的表现特征如下:

  • 训练误差较高。

  • 测试误差同样较高。

  • 模型可能过于简化,不能充分学习训练数据中的模式。

2.2过拟合

过拟合是指模型在训练数据上表现得非常好,但在其他数据上表现较差。这通常发生在模型过于复杂,以至于它不仅学习了数据中的真实模式,还学习了噪声和异常值。过拟合模型的表现特征如下:

  • 训练误差非常低。

  • 测试误差较高。

  • 模型可能过于复杂,以至于它对训练数据进行了过度拟合。

2.3正则化

正则化的意义:防止过拟合,增加模型的鲁棒性。

正则化:将原来的损失函数加上一个惩罚项使得计算出来的模型w相对小一些。

常用的惩罚项有L1正则项或者L2正则项:

2.3.1L1正则项(曼哈顿距离)

2.3.2L2正则项(欧氏距离 )

3.岭回归(Ridge)

3.1损失函数公式

岭回归是损失函数通过添加所有权重的平方和的乘积(L2)来惩罚模型的复杂度。

均方差除以2是因为方便求导,wj指所有的权重系数, λ指惩罚型系数,又叫正则项力度。

特点:

  • 岭回归不会将权重压缩到零,这意味着所有特征都会保留在模型中,但它们的权重会被缩小。

  • 适用于特征间存在多重共线性的情况。

  • 岭回归产生的模型通常更为平滑,因为它对所有特征都有影响。

3.2API 

sklearn.linear_model.Ridge()

参数:

  • alpha, default=1.0,正则项力度
  • fit_intercept, 是否计算偏置, default=True
  • solver, {‘auto’, ‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag’, ‘saga’, ‘lbfgs’}, default=’auto’

当值为auto,并且数据量、特征都比较大时,内部会随机梯度下降法。

  • normalize:default=True

数据进行标准化,如果特征工程中已经做过标准化,这里就该设置为False

  • max_iterint

梯度解算器的最大迭代次数,默认为15000

属性:
coef_ 回归后的权重系数
intercept_ 偏置

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error

# dataset = fetch_california_housing(data_home='./src')
dataset = load_breast_cancer()

x_train,x_test,y_train,y_test=train_test_split(dataset.data,dataset.target,train_size =0.2,shuffle =True,random_state=200)

transfer = StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)

# 线性回归预估器

estimator = Ridge(alpha =0.1,max_iter=1000)
estimator.fit(x_train,y_train)

# 模型数据
print('coef:',estimator.coef_)
print('intercept:',estimator.intercept_)

y_predict = estimator.predict(x_test)
print("预测的数据集:\n", y_predict)
print('得分:',estimator.score(x_test,y_test))
error = mean_squared_error(y_test,y_predict)
print('均方误差:',error)

4.拉索回归(Lasso)

4.1损失函数公式

Lasso回归是一种线性回归模型,它通过添加所有权重的绝对值之和(L1)来惩罚模型的复杂度。

Lasso回归的目标是最小化以下损失函数:

其中:

  • n 是样本数量,

  • p 是特征的数量,

  • y_i 是第 i 个样本的目标值,

  • x_i 是第 i 个样本的特征向量,

  • w是模型的参数向量,

  • \lambda 是正则化参数,控制正则化项的强度。

特点:

  • 拉索回归可以将一些权重压缩到零,从而实现特征选择。

  • 适用于特征数量远大于样本数量的情况,或者当特征间存在相关性时,可以从中选择最相关的特征。

  • 拉索回归产生的模型可能更简单,因为它会去除一些不重要的特征。

4.2API

sklearn.linear_model.Lasso()

参数:

  • alpha (float, default=1.0):

控制正则化强度;必须是非负浮点数。较大的 alpha 增加了正则化强度。

  • fit_intercept (bool, default=True):

是否计算此模型的截距。如果设置为 False,则不会使用截距(即数据应该已经被居中)。

  • precompute (bool or arraylike, default=False):

如果为 True,则使用预计算的 Gram 矩阵来加速计算。如果为数组,则使用提供的 Gram 矩阵。

  • copy_X (bool, default=True):

如果为 True,则复制数据 X

  • max_iter (int, default=1000):

最大迭代次数

  • tol (float, default=1e4):

精度阈值

  • warm_start (bool, default=False):

当设置为 True 时,再次调用 fit 方法会重新使用之前调用 fit 方法的结果作为初始估计值,而不是清零它们。

  • positive (bool, default=False):

当设置为 True 时,强制系数为非负。

  • random_state (int, RandomState instance, default=None):

随机数生成器的状态。用于随机初始化坐标下降算法中的随机选择。

  • selection ({'cyclic', 'random'}, default='cyclic'):

     如果设置为 'random',则随机选择坐标进行更新。如果设置为 'cyclic',则按照循环顺序选择坐标。

from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np

# 加载波士顿房价数据集
data = fetch_california_housing(data_home="./src")
X, y = data.data, data.target

# 划分训练集和测试集
X_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建Lasso回归模型
lasso = Lasso(alpha=0.1)  # alpha是正则化参数

# 训练模型
lasso.fit(X_train, y_train)

# 得出模型
print("权重系数为:\n", lasso.coef_)  
print("偏置为:\n", lasso.intercept_)

#模型评估
y_predict = lasso.predict(x_test)
print("预测的数据集:\n", y_predict)
error = mean_squared_error(y_test, y_predict)
print("均方误差为:", error)
print(lasso.score(x_test,y_test))

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

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

相关文章

探索ASP.NET Core 6 MVC与SqlServer的完美结合:一个开源示例项目

探索ASP.NET Core 6 MVC与SqlServer的完美结合&#xff1a;一个开源示例项目 【下载地址】ASP.NETCore6MVCSqlServer示例项目 ASP.NET Core 6 MVC SqlServer 示例项目本仓库提供了一个基于 ASP.NET Core 6 的 MVC 应用程序示例&#xff0c;使用 SqlServer 数据库 项目地址: …

LLM | 论文精读 | CVPR | Alpha-CLIP —— 一个聚焦目标区域的CLIP模型

论文标题&#xff1a;Alpha-CLIP: A CLIP Model Focusing on Wherever You Want 作者&#xff1a;Zeyi Sun, Ye Fang, Tong Wu, Pan Zhang, Yuhang Zang等 期刊&#xff1a;CVPR 2024 DOI&#xff1a;http://arxiv.org/pdf/2312.03818v2 email&#xff1a;yuhan.huangwhu.ed…

MySQL 的 Change Buffer 是什么?它有什么作用?

MySQL 的 Change Buffer 是什么&#xff1f;它有什么作用&#xff1f; MySQL 是目前广泛使用的开源数据库管理系统&#xff0c;其中的 InnoDB 存储引擎凭借其高性能、高可靠性以及强大的事务支持&#xff0c;成为了默认的存储引擎。在 InnoDB 的众多优化机制中&#xff0c;Cha…

axios 请求跨域问题

文章目录 1. 使用场景2. 解决办法 1. 使用场景 ① 编写后端测试接口&#xff0c;Vue-CLI 的默认端口为 8080&#xff0c;所以为避免端口冲突&#xff0c;我们后端的端口号换成 8081。 ② 前端通过 axios 向后端服务发起请求。 <script> import axios from axios export…

VConsole——(H5调试工具)前端开发使用于手机端查看控制台和请求发送

因为开发钉钉H5微应用在手机上一直查看不到日志等&#xff0c;出现安卓和苹果上传图片一边是成功的&#xff0c;一边是失败的&#xff0c;所以找了这个&#xff0c;之前在开发微信小程序进行调试的时候能看到&#xff0c;之前没想到过&#xff0c;这次被人提点发现可以单独使用…

集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码

集合卡尔曼滤波&#xff08;Ensemble Kalman Filter&#xff09; 文章目录 引言理论基础卡尔曼滤波集合卡尔曼滤波初始化预测步骤更新步骤卡尔曼增益更新集合 MATLAB 实现运行结果3. 应用领域结论 引言 集合卡尔曼滤波&#xff08;Ensemble Kalman Filter, EnKF&#xff09;是…

写给Vue2使用者的Vue3学习笔记

&#x1f64b;‍请注意&#xff0c;由于本人项目中引入了unplugin-auto-import的依赖&#xff0c;所以所有的代码示例中均未手动引入各种依赖库&#xff08;ref、reactive、useRouter等等&#xff09; 初始环境搭建 npm init vuelatest模板语法 插值 同 Vue2 <span>…

golang调用webview,webview2,go-webview2

go version go1.20 windows/amd64 先要了解一些第三方库 1、webview/webview 它是一个跨平台的轻量级的webview库&#xff0c;面向的是C/C&#xff0c;使用它可以构建跨平台的GUI。webview就是浏览器内核&#xff0c;在不同操作系统上是不同的库&#xff0c;比如在windows上…

【初阶数据结构篇】双向链表的实现(赋源码)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

结合第三方模块requests,文件IO、正则表达式,通过函数封装爬虫应用采集数据

#引用BeautifulSoup更方便提取html信息&#xff1b;requests模块&#xff0c;发生http请求&#xff1b;os模块&#xff0c;文件写入import requests from bs4 import BeautifulSoup import os#当使用requests库发送请求时&#xff0c;如果不设置User - Agent&#xff0c;默认的…

开源许可协议

何同学推动了开源协议的认识&#xff0c;功不可没&#xff0c;第一次对开源有了清晰的认识&#xff0c;最宽松的MIT开源协议 源自OSC开源社区&#xff1a;何同学使用开源软件“翻车”&#xff0c;都别吵了&#xff01;扯什么违反MIT

【达梦数据库】主备集群改造成读写分离

目录 背景步骤1、确认授权2、参数修改3、确认驱动版本和数据库版本匹配 背景 客户在双机主备集群手动切换的环境下&#xff0c;发现主库压力较大&#xff0c;需要改成读写分离的模式&#xff0c;将主库的压力分担到备库。 步骤 1、确认授权 select * from v$license;授权使…

docker安装zabbix +grafana

安装zabbix grafana 1、部署 mkdir -p /opt/zabbix/{data,backups}mkdir -p /opt/grafanasudo chown -R 472:472 /opt/grafanasudo chmod -R 755 /opt/grafanacat > docker-compose.yml <<-EOF version: 3.3services:mysql-server:image: mysql:8.1container_name: m…

RocketMQ学习记录

服务器操作系统版本&#xff1a;Ubuntu 24.04 Java版本&#xff1a;21 Spring Boot版本&#xff1a;3.3.5 如果打算用GUI&#xff0c;虚拟机安装Ubuntu 24.04&#xff0c;见虚拟机安装Ubuntu 24.04及其常用软件(2024.7)_ubuntu24.04-CSDN博客https://blog.csdn.net/weixin_4…

网络安全之接入控制

身份鉴别 ​ 定义:验证主题真实身份与其所声称的身份是否符合的过程&#xff0c;主体可以是用户、进程、主机。同时也可实现防重放&#xff0c;防假冒。 ​ 分类:单向鉴别、双向鉴别、三向鉴别。 ​ 主题身份标识信息:密钥、用户名和口令、证书和私钥 Internet接入控制过程 …

Spring 框架七大模块(Java EE 学习笔记03)

​ ​核心容器模块&#xff08;Core Container&#xff09; 核心容器模块在Spring的功能体系中起着支撑性作用&#xff0c;是其他模块的基石。核心容器层主要由Beans模块、Core模块、Contex模块和SpEL模块组成。 &#xff08;1&#xff09;Beans模块。它提供了BeanFactory类&…

IPv6基础知识

IPv6是由IEIF提出的互聯網協議第六版&#xff0c;用來替代IPv4的下一代協議&#xff0c;它的提出不僅解決了網絡地址資源匱乏問題&#xff0c;也解決了多種接入設備接入互聯網的障礙。IPv6的地址長度為128位&#xff0c;可支持340多萬億個地址。如下圖&#xff0c;3ffe:1900:fe…

旷世yolox自定义数据训练和验证和onnx导出推理

目录 1.前言 2.代码 3.环境 4.自定义数据形态 5.配置文件 6.训练 7.验证 8.评估混淆矩阵 9.导出onnx 10.onnx推理 -- 补充&#xff1a;docker环境 1.前言 旷世科技的yolox比较清爽&#xff0c;效果也不错&#xff0c;简单总结主要有三点创新比较高&#xff1a;deco…

Electron开发构建工具electron-vite(alex8088)添加VueDevTools(VitePlugin)

零、介绍 本文章的electron-vite指的是这个项目&#x1f449;electron-vite仓库&#xff0c;electron-vite网站 本文章的VueDevTools指的是VueDevTools的Vite插件版&#x1f449;https://devtools.vuejs.org/guide/vite-plugin 一、有一个用electron-vite创建的项目 略 二、…

软件测试—— Selenium 常用函数(一)

前一篇文章&#xff1a;软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中&#xff0c;我们介绍了自动化的一些基础知识&a…