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 28 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
Python机器学习算法之k均值聚类(k-means)
Feb 23 Python
pandas series序列转化为星期几的实例
Apr 11 Python
Python if语句知识点用法总结
Jun 10 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
matplotlib实现区域颜色填充
Mar 18 Python
python批量创建指定名称的文件夹
Mar 21 Python
python mysql断开重连的实现方法
Jul 26 Python
python实现单链表的方法示例
Sep 03 Python
python写一个随机点名软件的实例
Nov 28 Python
Selenium 安装和简单使用的实现
Dec 04 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中 $$str 中 &quot;$$&quot; 的详解
2015/07/06 PHP
PHP 的Opcache加速的使用方法
2017/12/29 PHP
使用PHP开发留言板功能
2019/11/19 PHP
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
Python中三元表达式的几种写法介绍
2019/03/04 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
2019/10/11 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
利用jupyter网页版本进行python函数查询方式
2020/04/14 Python
python+playwright微软自动化工具的使用
2021/02/02 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
大学生职业生涯规划范文
2013/12/31 职场文书
村干部培训班主持词
2014/03/28 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
小马王观后感
2015/06/11 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python