当前位置: 首页 > news >正文

多元线性回归算法python实现_机器学习算法python实现-线性回归

线性回归-Linear Regreesion

给定数据集

线性回归试图学得

,使

之间的差别尽可能小。

如何确定

,关键在于如何衡量

之间的差别,可以通过均方误差最小化

基于均方误差最小化来进行模型求解的方法称为“最小二乘法”

这里

是关于w和b的凸函数,当它关于w和b的导数均为零时,得到w和b的最优解。

求w和b的偏导:

令偏导为0:

推广到矩阵形式w的梯度为:

线性回归、批梯度下降、随机梯度下降优化具体算法可参考:kamidox.com​blog.kamidox.com

1.一元线性回归

import numpy as np

import matplotlib.pyplot as plt

x=np.array([1,2,3,4,5],dtype=np.float)

y=np.array([1,3.0,2,3,5],dtype=np.float)

plt.scatter(x,y)

x_mean=np.mean(x)

y_mean=np.mean(y)

num=0.0

d=0.0

for x_i,y_i in zip(x,y):

num+=(x_i-x_mean)*(y_i-y_mean)

d+=(x_i-x_mean)**2

a=num/d

b=y_mean-a*x_mean

y_hat=a*x+b

plt.figure(2)

plt.scatter(x,y) #描绘散点

plt.plot(x,y_hat,c='r') #描绘直线

2.多元线性回归批梯度下降

from sklearn.datasets import load_diabetes

from sklearn.model_selection import train_test_split

diabetes = load_diabetes()

data = diabetes.data

target = diabetes.target.reshape((-1,1))

X_train, X_test, y_train, y_test = train_test_split( data, target, test_size=0.3, random_state=2020)

print('X_train=', X_train.shape)

print('X_test=', X_test.shape)

print('y_train=', y_train.shape)

print('y_test=', y_test.shape)

out:

X_train= (309, 10)

X_test= (133, 10)

y_train= (309, 1)

y_test= (133, 1)

模型主体:

def linar_train(X, y, learning_rate=0.01, epochs=30000):

w, b = initialize(X.shape[1]) #初始化参数

for i in range(1, epochs):

y_hat, loss, dw, db = linar_loss(X, y, w, b)

w += -learning_rate * dw

b += -learning_rate * db

if i % 10000 == 0:

print('epoch %d loss %f' % (i, loss))

params = {

'w': w,

'b': b

}

grads = {

'dw': dw,

'db': db

}

return loss, params, grads

def initialize(dims):

"""将线性回归中w全部初始化为0w为dims行 1列的0矩阵"""

w = np.zeros((dims, 1))

b = 0

return w, b

def linar_loss(X, y, w, b):

"""计算损失函数num_train为数据集的数目num_feature为数据特征数y_hat为预测的y值loss 计算均方误差"""

num_train = X.shape[0]

num_feature = X.shape[1]

y_hat = np.dot(X, w) + b

loss = np.sum((y_hat-y)**2)/num_train #计算均方误差

dw = np.dot(X.T, (y_hat-y)) /num_train #X.T矩阵转置

db = np.sum((y_hat-y)) /num_train

return y_hat, loss, dw, db

训练数据:

loss, params, grads = linar_train(X_train, y_train, 0.001, 500000)

查看参数:

params

{'w': array([[ 18.12432661],

[-107.67245554],

[ 404.37142851],

[ 226.28953116],

[ -10.89733854],

[ -76.80225482],

[-174.88980099],

[ 126.33236945],

[ 353.19542078],

[ 170.24624517]]),

'b': 151.95335186539964}

可视化:

import matplotlib.pyplot as plt

f = X_test.dot(params['w']) + params['b']

plt.scatter(range(X_test.shape[0]), y_test)

plt.plot(f, color = 'darkorange')

plt.xlabel('X')

plt.ylabel('y')

plt.show()

参考:

相关文章:

  • 正确的座机号码格式_简历里的手机号及座机号的标准写法是什么?正确书写才更可能求职成功!...
  • 《走出软件作坊》序
  • python dict key顺序_python的dict中dict.keys()和dict.values()的提取是否遵守某种固定顺序?...
  • find linux 目录深度_linux find 命令查找文件和文件夹
  • 国际商务英语学习[十五]
  • redis统计用户日活量_使用redis统计用户日活、月活(实践版)
  • SerialPort类连接串口
  • labiview ni python_高效全能架构大前端精品教程python学习网站 百度云 百度网盘下载...
  • 更趋实用的Amazon Web Services
  • python iphone 爬虫_Python爬虫实战之抓取京东苹果手机评价!
  • 串口数据通信程序实现(SerialPort类方法)
  • python的win32模块_python模块:win32com用法详解
  • Compile syslog-win32
  • vs 输入代码时出现火花_VS Code插件介绍(六)TODO HIGHLIGHT
  • 国际商务英语学习[十六]
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【comparator, comparable】小总结
  • Android组件 - 收藏集 - 掘金
  • Angular数据绑定机制
  • ES6 学习笔记(一)let,const和解构赋值
  • ES6简单总结(搭配简单的讲解和小案例)
  • gulp 教程
  • input实现文字超出省略号功能
  • JavaScript 基本功--面试宝典
  • javascript从右向左截取指定位数字符的3种方法
  • Java知识点总结(JavaIO-打印流)
  • Laravel 实践之路: 数据库迁移与数据填充
  • Meteor的表单提交:Form
  • MySQL的数据类型
  • MySQL用户中的%到底包不包括localhost?
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Vue官网教程学习过程中值得记录的一些事情
  • 从0到1:PostCSS 插件开发最佳实践
  • 大快搜索数据爬虫技术实例安装教学篇
  • 浮动相关
  • 工作中总结前端开发流程--vue项目
  • 机器学习 vs. 深度学习
  • 跨域
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何在 Tornado 中实现 Middleware
  • 思维导图—你不知道的JavaScript中卷
  • 小程序 setData 学问多
  • 云大使推广中的常见热门问题
  • 追踪解析 FutureTask 源码
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • (¥1011)-(一千零一拾一元整)输出
  • (C语言)二分查找 超详细
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (差分)胡桃爱原石
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))