Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例


Posted in Python onOctober 15, 2020

公共的抽象基类

import numpy as np
from abc import ABCMeta, abstractmethod


class LinearModel(metaclass=ABCMeta):
 """
 Abstract base class of Linear Model.
 """

 def __init__(self):
  # Before fit or predict, please transform samples' mean to 0, var to 1.
  self.scaler = StandardScaler()

 @abstractmethod
 def fit(self, X, y):
  """fit func"""

 def predict(self, X):
  # before predict, you must run fit func.
  if not hasattr(self, 'coef_'):
   raise Exception('Please run `fit` before predict')

  X = self.scaler.transform(X)
  X = np.c_[np.ones(X.shape[0]), X]

  # `x @ y` == `np.dot(x, y)`
  return X @ self.coef_

Linear Regression

class LinearRegression(LinearModel):
 """
 Linear Regression.
 """

 def __init__(self):
  super().__init__()

 def fit(self, X, y):
  """
  :param X_: shape = (n_samples + 1, n_features)
  :param y: shape = (n_samples])
  :return: self
  """
  self.scaler.fit(X)
  X = self.scaler.transform(X)
  X = np.c_[np.ones(X.shape[0]), X]
  self.coef_ = np.linalg.inv(X.T @ X) @ X.T @ y
  return self

Lasso

class Lasso(LinearModel):
 """
 Lasso Regression, training by Coordinate Descent.
 cost = ||X @ coef_||^2 + alpha * ||coef_||_1
 """
 def __init__(self, alpha=1.0, n_iter=1000, e=0.1):
  self.alpha = alpha
  self.n_iter = n_iter
  self.e = e
  super().__init__()

 def fit(self, X, y):
  self.scaler.fit(X)
  X = self.scaler.transform(X)
  X = np.c_[np.ones(X.shape[0]), X]
  self.coef_ = np.zeros(X.shape[1])
  for _ in range(self.n_iter):
   z = np.sum(X * X, axis=0)
   tmp = np.zeros(X.shape[1])
   for k in range(X.shape[1]):
    wk = self.coef_[k]
    self.coef_[k] = 0
    p_k = X[:, k] @ (y - X @ self.coef_)
    if p_k < -self.alpha / 2:
     w_k = (p_k + self.alpha / 2) / z[k]
    elif p_k > self.alpha / 2:
     w_k = (p_k - self.alpha / 2) / z[k]
    else:
     w_k = 0
    tmp[k] = w_k
    self.coef_[k] = wk
   if np.linalg.norm(self.coef_ - tmp) < self.e:
    break
   self.coef_ = tmp
  return self

Ridge

class Ridge(LinearModel):
 """
 Ridge Regression.
 """

 def __init__(self, alpha=1.0):
  self.alpha = alpha
  super().__init__()

 def fit(self, X, y):
  """
  :param X_: shape = (n_samples + 1, n_features)
  :param y: shape = (n_samples])
  :return: self
  """
  self.scaler.fit(X)
  X = self.scaler.transform(X)
  X = np.c_[np.ones(X.shape[0]), X]
  self.coef_ = np.linalg.inv(
   X.T @ X + self.alpha * np.eye(X.shape[1])) @ X.T @ y
  return self

测试代码

import matplotlib.pyplot as plt
import numpy as np

def gen_reg_data():
 X = np.arange(0, 45, 0.1)
 X = X + np.random.random(size=X.shape[0]) * 20
 y = 2 * X + np.random.random(size=X.shape[0]) * 20 + 10
 return X, y

def test_linear_regression():
 clf = LinearRegression()
 X, y = gen_reg_data()
 clf.fit(X, y)
 plt.plot(X, y, '.')
 X_axis = np.arange(-5, 75, 0.1)
 plt.plot(X_axis, clf.predict(X_axis))
 plt.title("Linear Regression")
 plt.show()

def test_lasso():
 clf = Lasso()
 X, y = gen_reg_data()
 clf.fit(X, y)
 plt.plot(X, y, '.')
 X_axis = np.arange(-5, 75, 0.1)
 plt.plot(X_axis, clf.predict(X_axis))
 plt.title("Lasso")
 plt.show()

def test_ridge():
 clf = Ridge()
 X, y = gen_reg_data()
 clf.fit(X, y)
 plt.plot(X, y, '.')
 X_axis = np.arange(-5, 75, 0.1)
 plt.plot(X_axis, clf.predict(X_axis))
 plt.title("Ridge")
 plt.show()

测试效果

Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例

Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例

Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例

更多机器学习代码,请访问 https://github.com/WiseDoge/plume

以上就是Python 实现 3 种回归模型(Linear Regression,Lasso,Ridge)的示例的详细内容,更多关于Python 实现 回归模型的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在Django框架中编写Context处理器的方法
Jul 20 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
Django实现快速分页的方法实例
Oct 22 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
Jan 31 Python
理论讲解python多进程并发编程
Feb 09 Python
pytest中文文档之编写断言
Sep 12 Python
python实现把二维列表变为一维列表的方法分析
Oct 08 Python
python实现根据文件格式分类
Oct 31 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
Python如何操作office实现自动化及win32com.client的运用
Apr 01 Python
Python实现文件压缩和解压的示例代码
Aug 12 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
Oct 15 #Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 #Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 #Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 #Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 #Python
python实现粒子群算法
Oct 15 #Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 #Python
You might like
php pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
北京奥运官方网站幻灯切换效果flash版打包下载
2008/01/30 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
JS中改变this指向的方法(call和apply、bind)
2016/03/26 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
python操作MongoDB基础知识
2013/11/01 Python
Python实现抓取网页并且解析的实例
2014/09/20 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
DNA测试:Orig3n
2019/03/01 全球购物
架构师岗位职责
2013/11/18 职场文书
上班早退检讨书
2014/01/09 职场文书
个人培训自我鉴定
2014/03/28 职场文书
经典毕业生求职信
2014/07/12 职场文书
党员学习中共十八大思想报告
2014/09/12 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
2015年加油站工作总结
2015/05/13 职场文书
八年级数学教学反思
2016/02/17 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL