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 字符串格式化代码
Mar 17 Python
整理Python中的赋值运算符
May 13 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
python、java等哪一门编程语言适合人工智能?
Nov 13 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
python实现textrank关键词提取
Jun 22 Python
Python+OpenCV目标跟踪实现基本的运动检测
Jul 10 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
Python根据当前日期取去年同星期日期
Apr 14 Python
在VS2017中用C#调用python脚本的实现
Jul 31 Python
jupyter notebook 增加kernel教程
Apr 10 Python
Python基于字典实现switch case函数调用
Jul 22 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
服务器端解压缩zip的脚本
2006/12/22 PHP
PHP 变量类型的强制转换
2009/10/23 PHP
让PHP以ROOT权限执行系统命令的方法
2011/02/10 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
PHP中overload与override的区别
2017/02/13 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
2018/08/03 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
展览会邀请函
2015/02/02 职场文书
代理词怎么写
2015/05/25 职场文书
跳高加油稿
2015/07/21 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
导游词之太湖
2019/10/08 职场文书
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android