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实现dict版图遍历示例
Feb 19 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
python列表的增删改查实例代码
Jan 30 Python
python实现狄克斯特拉算法
Jan 17 Python
Python面向对象之类和实例用法分析
Jun 08 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
python 实现简单的FTP程序
Dec 27 Python
Windows上安装tensorflow  详细教程(图文详解)
Feb 04 Python
Python通过4种方式实现进程数据通信
Mar 12 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
javascript multibox 全选
2009/03/22 Javascript
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
用python实现面向对像的ASP程序实例
2014/11/10 Python
理解Python中的With语句
2015/02/02 Python
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
Django 请求Request的具体使用方法
2019/11/11 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
Python更新所有已安装包的操作
2020/02/13 Python
Python如何实现爬取B站视频
2020/05/20 Python
python如何实时获取tcpdump输出
2020/09/16 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
canvas像素画板的实现代码
2018/11/21 HTML / CSS
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
中医药大学毕业生自荐信
2013/11/08 职场文书
幼儿园保教管理制度
2014/02/03 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
企业管理毕业生求职信范文
2014/03/07 职场文书
实习生工作证明范本
2014/09/14 职场文书
python编写五子棋游戏
2021/05/25 Python
Java实现房屋出租系统详解
2021/10/05 Java/Android