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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
python实现图片批量剪切示例
Mar 25 Python
python写日志封装类实例
Jun 28 Python
Python多线程爬虫简单示例
Mar 04 Python
用python实现简单EXCEL数据统计的实例
Jan 24 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
python实现邮件自动发送
Aug 10 Python
基于python实现对文件进行切分行
Apr 26 Python
python thrift 实现 单端口多服务的过程
Jun 08 Python
Pygame框架实现飞机大战
Aug 07 Python
pandas 数据类型转换的实现
Dec 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学习之php4与php5之间会穿梭一点点感悟
2007/05/03 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
PHP中each与list用法分析
2016/01/08 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
通过JAVAScript实现页面自适应
2007/01/19 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
JS+CSS相对定位实现的下拉菜单
2015/10/06 Javascript
BootStrap 轮播插件(carousel)支持左右手势滑动的方法(三种)
2016/07/07 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
jQuery实现简单日期格式化功能示例
2017/09/19 jQuery
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Django的分页器实例(paginator)
2017/12/01 Python
Python中单、双下划线的区别总结
2017/12/01 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
python interpolate插值实例
2020/07/06 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
利用Python如何画一颗心、小人发射爱心
2021/02/21 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
纯CSS3实现运行时钟的示例代码
2021/01/25 HTML / CSS
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
群众路线教育党课主持词
2014/04/01 职场文书
教师年度考核评语
2014/04/28 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
MySQL 查询速度慢的原因
2021/05/25 MySQL
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA