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 相关文章推荐
gearman的安装启动及python API使用实例
Jul 08 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 Python
神经网络python源码分享
Dec 15 Python
python看某个模块的版本方法
Oct 16 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
Flask框架搭建虚拟环境的步骤分析
Dec 21 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
Feb 13 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
Python 实现简单的客户端认证
Jul 29 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+oracle 分页类
2006/10/09 PHP
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
php array_search() 函数使用
2010/04/13 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
用JS实现的一个include函数
2007/07/21 Javascript
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
VUE页面中加载外部HTML的示例代码
2017/09/20 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
JS中使用textPath实现线条上的文字
2017/12/25 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
2018/03/07 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
[03:28]2014DOTA2国际邀请赛 EG战队官方纪录片
2014/07/21 DOTA
初步解析Python中的yield函数的用法
2015/04/03 Python
举例详解Python中的split()函数的使用方法
2015/04/07 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
python实现顺序表的简单代码
2018/09/28 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
2019/04/29 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
使用CSS3制作响应式导航菜单的方法
2015/07/12 HTML / CSS
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
拉拉队口号
2014/06/16 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
《正比例》教学反思
2016/02/23 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技