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

python 数学公式_线性回归算法用到的数学公式及python实现

约定,m个数据,每个数据n个特征

代价函数

math?formula=J(%5Ctheta%20_%7B1%20%7D%2C%5Ctheta%20_%7B2%7D...%5Ctheta%20_%7Bn%7D)%3D%5Cfrac%7B1%7D%7B2m%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D(h_%7B%5Ctheta%20%7D(x%5E%7B(i)%7D)-y%5E%7B(i)%7D)%5E%7B2%7D

def cost(theta, x, y):

# x @ theta = (m,n) @ (n,) = (m,)

#j = np.sum(np.power((x.dot(theta) - y), 2)) / (2 * x.shape[0]) #写法1

#j = np.sum(np.power((x @ theta - y), 2)) / (2 * x.shape[0]) #写法2

j = ((x @ theta - y) @ (x @ theta - y)) / (2 * x.shape[0]) #写法3

return j

正则化代价函数

math?formula=J(%5Ctheta%20_%7B1%20%7D%2C%5Ctheta%20_%7B2%7D...%5Ctheta%20_%7Bn%7D)%3D%5Cfrac%7B1%7D%7B2m%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D(h_%7B%5Ctheta%20%7D(x%5E%7B(i)%7D)-y%5E%7B(i)%7D)%5E%7B2%7D%2B%5Cfrac%7B%5Clambda%20%7D%7B2m%7D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%5Ctheta_%7Bj%7D%5E%7B2%7D

def regularized_cost(theta, X, y, l=1):

m = X.shape[0]

regularized_term = (l.0 / (2.0 * m)) * np.power(theta[1:], 2).sum()

return cost(theta, X, y) + regularized_term

梯度下降法求解

math?formula=%5Ctheta

math?formula=%5Ctheta%20_%7B0%7D%3A%3D%5Ctheta%20_%7B0%7D-%5Calpha%20%5Cfrac%7B1%7D%7Bm%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%20%5B%20(h_%7B%5Ctheta%20%7D(x%5E%7B(i)%7D)-y%5E%7B(i)%7D)%20%5Cright%20%5D

math?formula=%5Ctheta%20_%7Bj%7D%3A%3D%5Ctheta%20_%7Bj%7D-%5Calpha%20%5Cfrac%7B1%20%7D%7Bm%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%20%5B%20(h_%7B%5Ctheta%20%7D(x%5E%7B(i)%7D)-y%5E%7B(i)%7D)x_%7Bj%7D%5E%7B(i)%7D%20%5Cright%20%5D

# 定义学习率alpha和迭代次数epoch

# loss存放每次修改theta后代价函数的值

loss = []

for i in range(epoch):

#theta = theta - (((x.dot(theta) - y).ravel()).dot(x)) * alpha / x.shape[0] #写法1

theta = theta - ((x @ theta - y) @ x) * alpha / x.shape[0] #写法2

loss.append(cost(theta, x, y))

return theta, loss

正则化梯度下降法求解

math?formula=%5Ctheta

math?formula=%5Ctheta%20_%7B0%7D%3A%3D%5Ctheta%20_%7B0%7D-%5Calpha%20%5Cfrac%7B1%7D%7Bm%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%20%5B%20(h_%7B%5Ctheta%20%7D(x%5E%7B(i)%7D)-y%5E%7B(i)%7D)%5Cright%20%5D

math?formula=%5Ctheta%20_%7Bj%7D%3A%3D%5Ctheta%20_%7Bj%7D-%5Calpha%20%5Cfrac%7B1%7D%7Bm%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%20%5B%20(h_%7B%5Ctheta%20%7D(x%5E%7B(i)%7D)-y%5E%7B(i)%7D)x_%7Bj%7D%5E%7B(i)%7D%20%5Cright%20%5D-%5Calpha%20%5Cfrac%7B%5Clambda%20%7D%7Bm%7D%5Ctheta%20_%7Bj%7D

求梯度

math?formula=%5Cfrac%7B%5Cpartial%20%7D%7B%5Cpartial%20%5Ctheta%20_%7Bj%20%7D%7DJ(%5Ctheta)%3D%20%5Cfrac%7B1%7D%7Bm%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%20%5B%20(h_%7B%5Ctheta%20%7D(x%5E%7B(i)%7D)-y%5E%7B(i)%7D)x_%7Bj%7D%5E%7B(i)%7D%20%5Cright%20%5D 其中j=0,1,2...n

def gradient(theta, x, y):

m = x.shape[0]

#return ((sigmoid(x.dot(theta))-y).T).dot(x)

# x @ theta => (n, m) @ (m,) = (n,)

# (sigmoid(x @ theta) - y).T => (n,)

# (sigmoid(x @ theta) - y).T @ x => (n,) @ (n,m) = (m,)

# 问题,其中.T不起作用啊

return ((x @ theta - y).T @ x) / m

求正则化梯度

math?formula=%5Cfrac%7B%5Cpartial%20%7D%7B%5Cpartial%20%5Ctheta%20_%7B0%20%7D%7DJ(%5Ctheta)%3D%20%5Cfrac%7B1%7D%7Bm%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%20%5B%20(h_%7B%5Ctheta%20%7D(x%5E%7B(i)%7D)-y%5E%7B(i)%7D)%20%5Cright%20%5D 其中j=0

math?formula=%5Cfrac%7B%5Cpartial%20%7D%7B%5Cpartial%20%5Ctheta%20_%7Bj%7D%7DJ(%5Ctheta)%3D%20%5Cfrac%7B1%7D%7Bm%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cleft%20%5B%20(h_%7B%5Ctheta%20%7D(x%5E%7B(i)%7D)-y%5E%7B(i)%7D)x_%7Bj%7D%5E%7B(i)%7D%20%5Cright%20%5D%20%2B%20%5Cfrac%7B%5Clambda%20%7D%7Bm%7D%5Ctheta%20_%7Bj%7D 其中j=1,2..n

def regularized_gradient(theta, x, y, lam):

m = x.shape[0]

regularized_term = lam * theta / m

regularized_term[0] = 0 # 不惩罚第一项

return gradient(theta, x, y) + regularized_term

添加多项式特征,比如[1, x] => [1, x, x^2, x^3, x^4, x^5]

def gen_poly_features(x, power):

"""添加多项式特征

每次在array的最后一列插入第二列的i+2次方(第一列为偏置)

从二次方开始开始插入(因为本身含有一列一次方)

"""

x_new = x.copy()

for i in range(2, power + 1):

x_new = np.insert(x_new, x_new.shape[1], np.power(x[:,1], i), axis=1)

return x_new

获取数据的均值和误差

def get_means_std(x):

means = np.mean(x, axis=0)

stds = np.std(x, axis=0, ddof=1) # ddof=1 means 样本标准差

return means, stds

对数据进行z-score标准化(正太标准化)

计算公式:z=(x-mean(x))/std(x)

def feature_normalize(x, means, stds):

x_norm = x.copy()

x_norm[:, 1:] = x_norm[:, 1:] - means[1:]

x_norm[:, 1:] = x_norm[:, 1:] / stds[1:]

return x_norm

绘制学习曲线

def plot_learning_curve(minimum, theta, x_train, y_train, x_cv, y_cv, lam):

'''

画出学习曲线,即交叉验证误差和训练误差随数据数量的变化的变化.

训练数据X从1开始逐渐增加,训练出不同的参数向量θ。接着通过交叉验证计算验证误差。

1.使用训练集的子集来训练模型,得到不同的theta;

2.通过theta计算训练误差和交叉验证误差,切记此时不要使用正则化,将λ设置为0;吴恩达机器学习87课时3分22秒明确说明了,但为什么那?

3.计算交叉验证误差时记得整个交叉验证集来计算,无需分为子集;

minimum:指定最少取多少数据,如果minimum=1,误差可能特别大,取全部数据后误差很小,绘图效果不好

'''

m = x_train.shape[0]

training_cost, cv_cost = [], []

for i in range(minimum, m + 1):

res = opt.minimize(fun=regularized_cost,

x0=theta, args=(x_train[:i, :], y_train[:i], lam),

method='TNC',

jac=regularized_gradient,

options={'disp': True})

tc = regularized_cost(res.x, x_train[:i, :], y_train[:i], 0) #

cv = regularized_cost(res.x, x_cv, y_cv, 0)

training_cost.append(tc)

cv_cost.append(cv)

plt.plot(np.arange(len(training_cost)), training_cost, label='training cost')

plt.plot(np.arange(len(cv_cost)), cv_cost, label='cv cost')

plt.legend()

plt.xlabel('Number of training examples')

plt.ylabel('Error')

plt.title('Learning curve for linear regression')

plt.grid(True)

相关文章:

  • delphi中的函数传参如何传枚举参数_函数调用背后的秘密——传参与返回值
  • python字符串处理函数汇总_超详细!盘点Python中字符串的常用操作
  • java接口应用在哪些方面_掏空了各大搜索引擎,整理了154道Java面试题!
  • flutter框架优缺点_2020年,一文点破跨平台开发框架现状
  • collect的功能是什么?其底层如何实现的?_用Python实现定时自动化收取蚂蚁森林能量,再也不怕被偷了...
  • docker python_「docker实战篇」python的docker-docker镜像的创建使用命令(32)
  • 在android studio中如何创建一个类来继承另外一个类_Python编程从入门到实践-连载8(类)...
  • python气象绘图速成_Python气象数据处理与绘图(11):矢量箭头图(风场,通量场)
  • ubuntu 自动挂载共享文件夹 /etc/fstab_使用 Cobbler 批量自动化部署 Windows 10 和 Windows Server 2019...
  • idea redis 插件_最全 !10个Redis可视化工具横向评测
  • sqlserver可视化工具_每个数据科学家都应该知道的18个基础工具
  • python coding_Python的编码注释# -*- coding:utf-8 -*-
  • python生成指定长度的列表_如何用Python创建固定长度的列表
  • 内存管理新技术_技术转管理,新项目经理都来看看
  • python中的json函数_Python Json模块中dumps、loads、dump、load函数介绍
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Angular 响应式表单之下拉框
  • ES6--对象的扩展
  • es的写入过程
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java面向对象及其三大特征
  • Mybatis初体验
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Protobuf3语言指南
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • vue 个人积累(使用工具,组件)
  • 编写高质量JavaScript代码之并发
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 力扣(LeetCode)56
  • 设计模式(12)迭代器模式(讲解+应用)
  • 使用docker-compose进行多节点部署
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 新版博客前端前瞻
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • ()、[]、{}、(())、[[]]命令替换
  • (九)信息融合方式简介
  • (四)Controller接口控制器详解(三)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)人的集合论——移山之道
  • .NET DataGridView数据绑定说明
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .netcore 获取appsettings
  • .net网站发布-允许更新此预编译站点
  • .NET运行机制
  • @31省区市高考时间表来了,祝考试成功
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [Android View] 可绘制形状 (Shape Xml)
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [C# 开发技巧]实现属于自己的截图工具
  • [C/C++] -- 二叉树