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实现树的先序、中序、后序排序算法示例
Jun 23 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
Python实现简易过滤删除数字的方法小结
Jan 09 Python
Python浮点数四舍五入问题的分析与解决方法
Nov 19 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
Python工程师必考的6个经典面试题
Jun 28 Python
通过实例简单了解python yield使用方法
Aug 06 Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 Python
python实现文件+参数发送request的实例代码
Jan 05 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
Python 无限级分类树状结构生成算法的实现
Jan 21 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
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
为jQuery增加join方法的实现代码
2010/11/28 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
JS产生随机数的用法小结
2016/12/10 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
JS中利用FileReader实现上传图片前本地预览功能
2018/03/02 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
Python中List.index()方法的使用教程
2015/05/20 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
python算法表示概念扫盲教程
2017/04/13 Python
浅析python递归函数和河内塔问题
2017/04/18 Python
Python实现字符串反转的常用方法分析【4种方法】
2017/09/30 Python
Python生成数字图片代码分享
2017/10/31 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
python实现控制COM口的示例
2019/07/03 Python
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
仓库管理专业个人的自我评价
2013/12/30 职场文书
道路交通事故赔偿协议书
2014/10/24 职场文书
2014年设计师工作总结
2014/11/25 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
自荐信大全
2019/03/21 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android