博客
关于我
26-sklearn中的随机梯度下降法
阅读量:235 次
发布时间:2019-02-28

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

一、随机梯度下降法的封装

  上一篇博客我们在 J u p y t e r N o t e b o o k Jupyter Notebook JupyterNotebook 使用了我们的随机梯度下降法,下面我们就将上一篇博客中的随机梯度下降法封装在 L i n e a R e g r e s s i o n LineaRegression LineaRegression 中,函数名为 fit_sgd。

# LinearRegression.pyimport numpy as npfrom metrics import r2_scoreclass LinearRegression:    def __init__(self):        """初始化 Linear Regression"""        self.coef_ = None           # 系数        self.interception_ = None   # 截距        self._theta = None          # θ    def fit_normal(self, X_train, y_train):        """根据训练数据集X_train,y_train训练Linear Regression模型"""        assert X_train.shape[0] == y_train.shape[0], \            "the size of X_train must be equal to the size of y_train"        X_b = np.hstack([np.ones((len(X_train), 1)), X_train]) # 在 X_train 前加一列 1        self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)        self.interception_ = self._theta[0]     #截距        self.coef_ = self._theta[1:]            #系数        return self    def fit_gd(self, X_train, y_train, eta=0.01, n_iters=1e4):        """根据训练数据集X_train,y_train,使用梯度下降法训练Linear Regression模型"""        assert X_train.shape[0] == y_train.shape[0], \            "the size of X_train, y_train must be equal to the size of y_train"        def J(theta, X_b, y):            try:                return np.sum((y - X_b.dot(theta)) ** 2) / len(X_b)            except:                return float('inf')        def dJ(theta, X_b, y):            return X_b.T.dot(X_b.dot(theta) - y) * 2 / len(X_b)        def gradient_descent(X_b, y, initial_theta, eta, n_iters=1e4, epsilon=1e-8):            theta = initial_theta            i_iter = 0            while i_iter < n_iters:                gradient = dJ(theta, X_b, y)                last_theta = theta                theta = theta - eta * gradient                if(abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):                    break                i_iter += 1            return theta        X_b = np.hstack([np.ones((len(X_train), 1)), X_train])        initial_theta = np.zeros(X_b.shape[1])        self._theta = gradient_descent(X_b, y_train, initial_theta, eta)        self.interception_ = self._theta[0]        self.coef_ = self._theta[1:]        return self    def fit_sgd(self, X_train, y_train, n_iters=5, t0=5, t1=50):        """根据训练数据集X_train,y_train, 使用梯度下降法训练LinearRegression模型"""        assert X_train.shape[0] == y_train.shape[0], \            "the size of X_train must be equal to the size of y_train"        assert n_iters >= 1 # 至少将样本看一次        def dJ_sgd(theta, X_b_i, y_i):            return X_b_i.T,dot(X_b_i.dot(theta) - y_i) * 2        def sgd(X_b, y, initial_theta, n_iters, t0=5, t1=50):            def learning_rate(t):                return t0 / (t + t1)            theta = initial_theta            m = len(X_b)            for i_iters in range(n_iters): #至少要将将我们的样本个数(m)看5遍                # 为了保证每一遍都能够遍历了所有的样本数,我们先将下标乱序,然后依次进行遍历                # 这样既保证了随机性,又保证了能够遍历到每一个样本                indexes = np.random.permutation(m)                X_b_new = X_b[indexes]                y_new = y[indexes]                for i in randge(m):                    gradient = dJ_sgd(theta, X_b_new[i], y_new[i])                    theta = theta - learning_rate(i_iters * m + i) * gradient            return theta        X_b = np.hstack([np.ones((len(X_train), 1)), X_train])        initial_theta = np.zeros(X_b.shape[1])        self._theta = sgd(X_b, y_train, initial_theta)        self.interception_ = self._theta[0]        self.coef_ = self._theta[1:]        return self    def predict(self, X_predict):        """给定待预测数据集X_predict,返回表示X_predict的结果向量"""        assert self.interception_ is not None and self.coef_ is not None, \            "must fit before predict!"        assert X_predict.shape[1] == len(self.coef_), \            "the feature number of X_predict must be equal to X_train"        X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])        return X_b.dot(self._theta)    def score(self, X_test, y_test):        """根据测试数据集X_test和y_test确定当前模型的准确度"""        y_predict = self.predict(X_test)        return r2_score(y_test, y_predict)    def __repr__(self):        return "LinearRegression()"

二、随机梯度下降法的的使用

下面我们就具体编程使用:

在这里插入图片描述

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


  这篇博客主要实际的使用随机梯度下降法完成了我们的线性回归的过程,我在下一篇博客将对我之前学习的梯度下降法进行一个总结。与此同时,会讨论更多与梯度下降算法相关的内容。

具体代码见

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

你可能感兴趣的文章
Nginx:现代Web服务器的瑞士军刀 | 文章末尾送典藏书籍
查看>>
ngModelController
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
ngrok内网穿透可以实现资源共享吗?快解析更加简洁
查看>>
NHibernate动态添加表
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
Nhibernate的第一个实例
查看>>
NHibernate示例
查看>>
nid修改oracle11gR2数据库名
查看>>
NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
查看>>
NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
查看>>
NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
查看>>