博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bobo老师机器学习笔记第六课-调试梯度下降法
阅读量:4170 次
发布时间:2019-05-26

本文共 2596 字,大约阅读时间需要 8 分钟。

a在用梯度下降法训练模型的时候,有时候我们要在训练前大概了解一下参数,那么怎么进行调试呢。Bobo老师分享了一种方法,我分享给大家。 

1、主要思想

这种思想主要是根据导数的定义,其实梯度就是多元导数对单个参数的求偏导,所以利用导数的概念也可以求出梯度。 

在上图中,可以看出, 红点处的导数可以用两个蓝点的值获取。 其中\varepsilon是一个比较小的数字,一般可以选0.01 

扩展到多元,梯度就是如下:

对于导数理解不深的朋友,可以查看

2、 编码实现

基于上一篇文章的代码,我们在LineRegression中新增一个dj_debug的方法,来计算调试梯度。

import numpy as npclass LineRegression(object):    def __init__(self):        self._ethta = None        self.coef_ = None        self.intercept_ = None    def fit_gd(self, x_train, y_train, eta=0.01, n_iters=1e4):        def J(X_b, y, ethta):            return np.sum((X_b.dot(ethta) - y) ** 2) / len(X_b)        def DJ(X_b, y, ethta):            return 2 * (X_b.T.dot(X_b.dot(ethta) - y)) / len(X_b)        def dj_debug(X_b, y, ethta, epsilon=0.01):            """            用来调试梯度            :return:            """            res = np.empty(X_b.shape[1])            for i in range(len(ethta)):                ethta_1 = ethta.copy()                ethta_1[i] += epsilon                ethta_2 = ethta.copy()                ethta_2[i] -= epsilon                res[i] = (J(X_b, y, ethta_1) - J(X_b, y, ethta_2)) / (2 * epsilon)            return res        def gradient_descent(X_b, y, init_ethta, eta, n_iters, explision=1e-16):            ethta = init_ethta            cur_in = 0            while cur_in < n_iters:                last_ethta = ethta                #gradient = DJ(X_b, y, ethta)                gradient = dj_debug(X_b, y, ethta)                ethta = ethta - eta * gradient                if abs(J(X_b, y, ethta) - J(X_b, y, last_ethta)) < explision:                    break            return ethta        X_b = np.hstack([np.ones((len(x_train), 1)), x_train])        init_ethta = np.zeros(X_b.shape[1])        self._ethta = gradient_descent(X_b, y_train, init_ethta, eta, n_iters)        print('ethta:', self._ethta)        self.intercept_ = self._ethta[0]        self.coef_ = self._ethta[1:]
from linearregession.linearregession import  LineRegressionfrom sklearn import datasetsfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerimport numpy as npif __name__ == '__main__':    m = 100000    x = np.random.normal(size=m)    X = x.reshape(-1, 1)    y = 3 * x + 4.0 + np.random.normal(0,3, size=m)    X_train, X_test, y_train, y_test = train_test_split(X, y)    stdscaler = StandardScaler()    stdscaler.fit(X_train)    x_train_standard = stdscaler.transform(X_train)    lrg = LineRegression()    lrg.fit_gd(x_train_standard, y_train)

运行结果:

ethta: [4.02166099 2.98053422]

从这个结果来看,其实我们调试出来的参数和实际的差不多。调试计算梯度的运行效率就是有点低。 

要是你在西安,感兴趣一起学习AIOPS,欢迎加入QQ群 860794445

转载地址:http://thkai.baihongyu.com/

你可能感兴趣的文章
MySQL- InnoDB监控20201122
查看>>
MySQL版本升级20201128
查看>>
liux7防火墙管理20201209
查看>>
MySQLInnoDB锁与事务理解20201210
查看>>
MySQLInnoDB存储引擎基本管理20201128
查看>>
MySQLInnoDB表空间管理20201109
查看>>
MySQL InnoDB redo与undo20201222
查看>>
MySQL-OnlineDDL20201228
查看>>
MySQL-备份与恢复简介20210103
查看>>
MySQL-Binlog二进制日志介绍20200106
查看>>
liux7安装Python3与PyMySQL
查看>>
MySQL逻辑备份恢复mysqldump20210204
查看>>
MySQL逻辑备份恢复mysqlpump20210217
查看>>
MySQL逻辑备份恢复mysqldumper20210225
查看>>
MySQL物理备份xtrabackup-innobackupex20210304
查看>>
MySQL物理备份xtrabackup-20210310
查看>>
MySQL物理备份mysqlbackup-20210315
查看>>
中标麒麟高级系统V7安装PG11
查看>>
MySQL数据导入导出20210328
查看>>
MySQL单库优化概述20210403
查看>>