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 相关文章推荐
python实现爬虫下载美女图片
Jul 14 Python
Python的Tornado框架实现图片上传及图片大小修改功能
Jun 30 Python
对Python w和w+权限的区别详解
Jan 23 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
Oct 12 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
新建文件时Pycharm中自动设置头部模板信息的方法
Apr 17 Python
Python基于Tkinter编写crc校验工具
May 06 Python
Python读取JSON数据操作实例解析
May 18 Python
python编程的核心知识点总结
Feb 08 Python
实操Python爬取觅知网素材图片示例
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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
什么是JavaScript
2009/08/13 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
深入分析node.js的异步API和其局限性
2016/09/05 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
javascript中导出与导入实现模块化管理教程
2020/12/03 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
java直接调用python脚本的例子
2014/02/16 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
python使用PIL实现多张图片垂直合并
2019/01/15 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
python自定义函数实现最大值的输出方法
2019/07/09 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
2020/02/26 Python
Python如何用filter函数筛选数据
2020/03/05 Python
Python如何将函数值赋给变量
2020/04/28 Python
python 基于opencv操作摄像头
2020/12/24 Python
input元素的url类型和email类型简介
2012/07/11 HTML / CSS
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
某公司Java工程师面试题笔试题
2016/03/27 面试题
仓管岗位职责范本
2014/02/08 职场文书
同学聚会主持词
2014/03/18 职场文书
离婚协议书格式
2014/11/21 职场文书
初中语文教师研修日志
2015/11/13 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS