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. 【ClickHouse问题】更新表字段类型为Nullable(Int32)的列值,最终结果都是固定一个值:93147008???

    问题描述: clickhouse更新表数据.更新的列数据类型是Nullable(Int32),不管更新为什么数值,最后查询的结果都是一个固定值:93147008 问题复现: 1:建一张测试表 CREA ...

  2. 一个用来画拉氏图的简单Python脚本

    技术背景 关于拉氏图的更多介绍,可以参考下这篇博客,这里简单引述一部分内容: Ramachandran plot(拉氏图)是由G. N. Ramachandran等人于1963年开发的,用来描述蛋白质 ...

  3. Visual Studio中如何解决error C4996: 问题

    error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To di ...

  4. JavaScript高级~数组偏平化

    方式一: let arr=[11,[22,[33,[44]]],[55,66,77],88,99,['00']] let arr2=arr.toString().split("," ...

  5. 2023年最新ios证书申请流程

    做过前端多端开发的朋友们都知道,hbuilderx或apicloud这些开发工具的uniapp框架可以开发ios应用,使用他们的云打包即可. 云打包的时候需要一个私钥证书和一个profile文件,这两 ...

  6. 我出一道面试题,看看你能拿 3k 还是 30k!

    大家好,我是程序员鱼皮.欢迎屏幕前的各位来到今天的模拟面试现场,接下来我会出一道经典的后端面试题,你只需要进行 4 个简单的选择,就能判断出来你的水平是新手(3k).初级(10k).中级(15k)还是 ...

  7. mysql中的隐式转换导致全表扫描

    mysql中的隐式转换导致全表扫描 在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引.下面分析两种隐式转换的情况 看表结构 phone为 int类型,na ...

  8. Python和RPA网页自动化-让select标签下拉框选择指定文本的方法

    以影刀商城(https://shop.yingdao.com/webOperations/index)为例: 该下拉框有<select>标签.分别使用Python和RPA网页自动化让下拉框 ...

  9. 测试工程师-年终总结PPT

    2022年年终总结-xxx 一.首页 2022年年终总结暨2023年工作计划 汇报人:测试组-xxx 日期: 2023.1.13 二.目录 1.年度工作概述 2.工作亮点展示 3.持续精进点 4.明年 ...

  10. web3 产品介绍: walletconnect 连接Web3 DApps与用户的移动加密钱包

    WalletConnect是一种去中心化的开源协议,旨在连接Web3 DApps与用户的移动加密钱包,提供更安全.更便捷的加密货币交易体验.在本文中,我们将介绍WalletConnect的主要特点.工 ...