SciPy简介

SciPy是一种以NumPy为基础,用于数学、工程及许多其他的科学任务的科学计算包,其使用的基本数据结构是由NumPy模块提供的多维数组,因此Numpy和SciPy协同使用可以更加高效地解决问题。SciPy很适合用于十分依赖数学和数值运算的问题,其内部的模块包括优化模块、线性代数模块、统计模块、傅里叶变化模块、积分模块、信号处理模块、图像处理模块、稀疏矩阵模块、插值模块等。

SciPy中本专业比较重要且常用的有优化、线性代数、统计这三个模块:

  • 拟合与优化模块(scipy.optimize): scipy.optimize提供了很多数值优化算法,包括多元标量函数的无约束极小化、多元标量函数的有约束极小化、全局优化、最小二乘法、单变量函数求解、求根、线性规划、指派问题等问题的求解。
  • 线性代数模块(scipy.linalg):利用scipy.linalg可以计算行列式det()、求解线性方程组linalg.solve()、求特征值-特征向量linalg.eig()、奇异值分解linalg.svd()等;与numpy.linalg相比,scipy.linalg除了包含numpy.linalg中的所有函数,还包含了numpy.linalg没有的高级功能。
  • 统计模块(scipy.stats):scipy.stats包含了大量统计以及概率分析工具。scipy.stats对离散统计分布和连续统计分布均可有效处理,内部函数包括离散统计分布的概率质量函数(Probability Mass Function,PMF)、累积分布函数(Cumulative Distribution Function,CDF),连续统计分布的概率密度函数(Porbability Density Function,PDF)、累积分布函数等各类方法,以及计算其中位数、百分位数、平均值,统计检验等。

拟合与优化模块

导入需要的模块:

from scipy import optimize
import numpy as np
import matplotlib.pyplot as plt

求最小值

假定有函数f(x),并希望求得其最小值,首先在Python中定义该函数,并借助借助NumPy中的三角函数可以实现函数的定义,并绘制函数图像: f(x)=x^4/100+20sin⁡(x)

公式实现代码:

def f(x):
return 0.01 * x**4 + 20 * np.sin(x)

从图中分析可知,最小值点应在0点左侧。接着,使用optimize模块求出最小值及最小值点。求解该类问题最小值的方法一般是从初始点开始使用梯度下降法求解,因此模型输入中需要指定要求解的函数以及初始点,在optimize模块中可以使用bfgs算法(牛顿算法),代码及返回结果如下:

optimize.fmin_bfgs(f, 0)

可以看到,通过四次迭代求出了当前最小值为-19.939711,最小值点为x=-1.56315723,但有可能该值并不是全局最小值,而是局部最小值,这也是bfgs算法存在缺陷。为了验证这一解是全局最优解,可以通过设置随机的初始点,获取全局最小值(设置得越多,时间成本越高)此处使用暴力求解算法Brute-force:

tmp = (-15,15,0.1)
global_minX = optimize.brute(f,(tmp,))
print(global_minX)#[-1.563125]

通过设置随机的初始点进行求解,得到的最小值点的横坐标为x=-1.563125,回忆之前的最小值点的横坐标为x=-1.56315723,二者不等,故其并非全局最优解对应的点。

曲线拟合

下面将通过最小二乘法拟合余弦函数。首先定义拟合函数图形以及误差函数,用于拟合的函数图形定义为下式,其中a、K、b为参数,整个拟合过程代码如下: f(x)=asin⁡(2K*π+b)

#定义拟合函数图形
def func(x,m):
a,K,b = m
return a*np.sin(2*K*np.pi*x+b) #定义误差函数
def error(m,x,y):
return y-func(x,m)
#生成训练数据
#给出参数的初始值
p = [20,0.5,np.pi/4]
a,K,b = p
x = np.linspace(0,2*np.pi,1000) # 划定x范围 0-2pai #随机指定参数
y = func(x,[a,K,b])
#randn(m)从标准正态分布中返回m个值,在本例作为噪声
y_ = y + 2*np.random.randn(len(x)) #进行参数估计
Para = optimize.leastsq(error,p,args=(x,y_))
a,K,b = Para[0]
print('a=',a, 'K=',K,'b=',b)

# 图形可视化
plt.figure(figsize=(20, 8))
ax1 = plt.subplot()
plt.sca(ax1)
# 绘制散点图
plt.scatter(x, y_, color='gray', label='Sample Points', linewidth=3)
plt.xlabel('x')
plt.xlabel('y')
y = func(x, p)
plt.plot(x, y, color='red', label='Target line', linewidth=2)
# 显示图例和图形
plt.legend()
plt.show()

依据生成的样本点,用上式定义的函数图像进行拟合,可以得到拟合函数曲线的三个参数对应的值:a= 20.07,K= 0.499,b= 0.786,将结果可视化,如图所示。

线性代数模块

下面结合例子了解学习对于矩阵的一些操作。首先导入需要的模块并创建一个矩阵,可通过以下代码获取matrix的行列式和逆矩阵。此部分与NumPy使用方法类似,更多矩阵操作查阅:NumPy从入门到放弃

from scipy import linalg
matrix = np.array([[9,2,8],[2,5,6],[5,1,3]])
det = linalg.det(matrix)
print(det)
inv = linalg.inv(matrix)
print(inv)

matrix的逆矩阵如下图所示。

统计模块

下面结合例子学习如何使用SciPy实现直方图和概率密度函数以及统计检验。首先导入需要的模块:

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt

直方图和概率密度函数

可以通过stats.norm实现正态分布,正态分布的概率密度函数标准形式如下式,调用其中的stats.norm.pdf(x,loc,scale)实现正态分布,并将其可视化,可以看到生成了3个不同均值和方差的正态分布: f(x)= e(-x2/2)/√2π

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt plt.figure(figsize=(12, 8))
x = np.linspace(-10, 10, num=40) gauss1 = stats.norm(loc=0, scale=2) # loc: mean 均值, scale: standard deviation 标准差
gauss2 = stats.norm(loc=1, scale=3)
gauss3 = stats.norm(loc=-4, scale=2.5) y1 = gauss1.pdf(x)
y2 = gauss2.pdf(x)
y3 = gauss3.pdf(x)
plt.plot(x, y1, color='orange', label='u=0,sigma=2')
plt.plot(x, y2, color='green', label='u=1,sigma=3')
plt.plot(x, y3, color='purple', label='u=-4,sigma=2.5')
plt.legend(loc='upper right')

统计检验

生成两组观测值,假设他们都来自于高斯过程,可以用T检验来判断这两组观察值是否显著不同:

a = np.random.normal(1, 2, size=1000)
b = np.random.normal(2, 2, size=10)
stats.ttest_ind(a, b)

返回值:statistic=-1.94,pvalue=0.05,其中第一部分为T统计值,符号与两个随机过程的差异成比例,大小与差异的程度相关;第二个为p值,表示两个过程相同的概率。

公众号本文地址:https://mp.weixin.qq.com/s?__biz=Mzg3MTU1NzcxMg==&mid=2247489213&idx=1&sn=918b87adcca86dcb4349e30e6684c164&chksm=cefde982f98a60942b94416d89862a2c6ad8e91dd9e7b2f73037a82e7462e06c4eecc7bd26fe#rd

SciPy从入门到放弃的更多相关文章

  1. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  2. [精品书单] C#/.NET 学习之路——从入门到放弃

    C#/.NET 学习之路--从入门到放弃 此系列只包含 C#/CLR 学习,不包含应用框架(ASP.NET , WPF , WCF 等)及架构设计学习书籍和资料. C# 入门 <C# 本质论&g ...

  3. OpenStack从入门到放弃

    OpenStack从入门到放弃 目录: 为何选择云计算/云计算之前遇到的问题 什么是云计算 云服务模式 云应用形式 传统应用与云感知应用 openstack及其相关组件介绍 flat/vlan/gre ...

  4. 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃

    一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...

  5. 《区块链:从入门到放弃》之obc安装步骤

    obc安装步骤 朋友们可能会好奇,厨师不研究菜谱怎么改研究兵法了,哈哈,我原本是app出身,最近被安排去预研区块链和比特币技术,2个月下来,颇有斩获.期间得到IBM的CC同学指导我一步一步安装obc的 ...

  6. win10搭建代理服务器实现绕过校园网的共享限制--从入门到放弃

    博主所在学校特别坑爹,校园网被电信一家垄断了,而且最恶心的还是电信要求一条网线只能供一台电脑上网,不许接路由器共享网络= =- (还有电信2M价格是380+每年,20m是500每年,而且网速都很慢= ...

  7. WPF从入门到放弃系列第二章 XAML

    本文是作者学习WPF从入门到放弃过程中的一些总结,主要内容都是对学习过程中拜读的文章的整理归纳. 参考资料 XAML 概述 (WPF):https://msdn.microsoft.com/zh-cn ...

  8. Android -- 带你从源码角度领悟Dagger2入门到放弃

    1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...

  9. Android -- 带你从源码角度领悟Dagger2入门到放弃(二)

    1,接着我们上一篇继续介绍,在上一篇我们介绍了简单的@Inject和@Component的结合使用,现在我们继续以老师和学生的例子,我们知道学生上课的时候都会有书籍来辅助听课,先来看看我们之前的Stu ...

  10. 从入门到放弃,.net构建博客系统(二):依赖注入

    文章目录:<从入门到放弃,.net构建博客系统> 从入门到放弃,.net构建博客系统(一):系统构建 从入门到放弃,.net构建博客系统(二):依赖注入 上一篇中有讲到项目启动时会进行io ...

随机推荐

  1. Asp .Net Core 系列:基于 Castle DynamicProxy + Autofac 实践 AOP 以及实现事务、用户填充功能

    目录 什么是 AOP ? .Net Core 中 有哪些 AOP 框架? 基于 Castle DynamicProxy 实现 AOP IOC中使用 Castle DynamicProxy 实现事务管理 ...

  2. vulhub - INFOSEC PREP: OSCP

    vulhub - INFOSEC PREP: OSCP 信息收集 nmap 192.168.157.0/24 nmap -sT --min-rate 10000 -p- 192.168.157.162 ...

  3. SpringBoot 整合模板引擎 jetbrick-template

    添加依赖 <dependency> <groupId>com.github.subchen</groupId> <artifactId>jetbrick ...

  4. Mac 设置多个版本JDK

    控制台: p.p1 { margin: 0; font: 11px Menlo; color: rgba(0, 0, 0, 1) } span.s1 { font-variant-ligatures: ...

  5. Golang 切片作为函数参数传递的陷阱与解答

    作者:林冠宏 / 指尖下的幽灵.转载者,请: 务必标明出处. GitHub : https://github.com/af913337456/ 出版的书籍: <1.0-区块链DApp开发实战&g ...

  6. 解读MySQL 8.0数据字典缓存管理机制

    背景介绍 MySQL的数据字典(Data Dictionary,简称DD),用于存储数据库的元数据信息,它在8.0版本中被重新设计和实现,通过将所有DD数据唯一地持久化到InnoDB存储引擎的DD t ...

  7. [oeasy]python0003_ 终端大冒险_终端命令_whoami_pwd_ls

    终端大冒险_终端命令_ls_pwd_whoami 回忆 上次 了解基本环境 简称 含义 CLI 命令行界面 GUI 图形用户界面 在 CLI 中 通过终端 连接 远程服务器的 壳(shell) 控制 ...

  8. 可视化—gojs 超多超实用经验分享(四)

    目录 41.监听连线拖拽结束后的事件 42.监听画布的修改事件 43.监听节点被 del 删除后回调事件(用于实现调用接口做一些真实的删除操作) 44.监听节点鼠标移入移出事件,hover 后显示特定 ...

  9. [rCore学习笔记 09]为内核支持函数调用

    在[[08 内核第一条指令|上一节]]我们使用了编写entry.asm函数中编写了内核的第一条指令,但是我们使用的汇编.这里注意我们仍然是嵌入了这段asm代码到我们的rust代码之中,然后进行编译.但 ...

  10. 痞子衡嵌入式:MCUXpresso IDE下在线联合调试i.MXRT1170双核工程的三种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下在线联合调试i.MXRT1170双核工程的三种方法. 两年前痞子衡写过一篇<i.MXRT1170下在 ...