SciPy从入门到放弃
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值,表示两个过程相同的概率。
SciPy从入门到放弃的更多相关文章
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- [精品书单] C#/.NET 学习之路——从入门到放弃
C#/.NET 学习之路--从入门到放弃 此系列只包含 C#/CLR 学习,不包含应用框架(ASP.NET , WPF , WCF 等)及架构设计学习书籍和资料. C# 入门 <C# 本质论&g ...
- OpenStack从入门到放弃
OpenStack从入门到放弃 目录: 为何选择云计算/云计算之前遇到的问题 什么是云计算 云服务模式 云应用形式 传统应用与云感知应用 openstack及其相关组件介绍 flat/vlan/gre ...
- 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃
一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...
- 《区块链:从入门到放弃》之obc安装步骤
obc安装步骤 朋友们可能会好奇,厨师不研究菜谱怎么改研究兵法了,哈哈,我原本是app出身,最近被安排去预研区块链和比特币技术,2个月下来,颇有斩获.期间得到IBM的CC同学指导我一步一步安装obc的 ...
- win10搭建代理服务器实现绕过校园网的共享限制--从入门到放弃
博主所在学校特别坑爹,校园网被电信一家垄断了,而且最恶心的还是电信要求一条网线只能供一台电脑上网,不许接路由器共享网络= =- (还有电信2M价格是380+每年,20m是500每年,而且网速都很慢= ...
- WPF从入门到放弃系列第二章 XAML
本文是作者学习WPF从入门到放弃过程中的一些总结,主要内容都是对学习过程中拜读的文章的整理归纳. 参考资料 XAML 概述 (WPF):https://msdn.microsoft.com/zh-cn ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃(二)
1,接着我们上一篇继续介绍,在上一篇我们介绍了简单的@Inject和@Component的结合使用,现在我们继续以老师和学生的例子,我们知道学生上课的时候都会有书籍来辅助听课,先来看看我们之前的Stu ...
- 从入门到放弃,.net构建博客系统(二):依赖注入
文章目录:<从入门到放弃,.net构建博客系统> 从入门到放弃,.net构建博客系统(一):系统构建 从入门到放弃,.net构建博客系统(二):依赖注入 上一篇中有讲到项目启动时会进行io ...
随机推荐
- UML建模、设计原则
# UML统一建模语言 定义: 用于软件系统设计与分析的语言工具 目的: 帮助开发人员更好的梳理逻辑.思路 官网: https://www.omg.org/spec/UML 画图工具可以用在线网址:h ...
- C语言gcc编译环境搭建
第一步,根据以下链接下载gcc工具包: gcc工具包下载地址: 链接:https://pan.baidu.com/s/1JqEjakTcWLPv7p6zkah6sA提取码:k4d2 第二步,将下载好的 ...
- 解决方案 | Get-AppxPackage : 无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动
前几天由于需要卸载一些win10自带应用,导致onenote2016无法启动(根本原因:当时可能remove-appxpackage导致某些微软原生应用出现问题),同时今天使用power shell出 ...
- 变频器通过Modbus转Profinet网关接电机与PLC通讯在自动化的应用
巴图自动化Profinet转Modbus模块(BT-MDPN10)是一种用于不同通讯协议之间互连的设备,它可以将Profinet与Modbus这两种不同的通讯协议进行转换,从而实现设备之间的通讯和数据 ...
- .NET Core 3.x 基于AspectCore实现AOP,实现事务、缓存拦截器
最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理.给一个方法加一个缓存特性,那这个方法就会进行缓存.这个也是网上说的面向切面编程AOP. A ...
- Linux 中 Crontab 执行时的环境变量问题(allure命令不执行)
前几天做了UI自动化脚本部署linux服务器,但是放下脚本的allure命令不执行(生成allure报告和启动allure服务的命令不执行),然后就各种找问题,一开始怀疑是allure的环境变量问题, ...
- OpenStack 基本命令
keystone source /etc/keystone/admin-openrc.sh #登录 openstack user create --password ps1234 --email hq ...
- 【Tutorial C】04 基本输入输出
输出单个字符 putchar('a'); // 字符输出函数,其功能是在终端(显示器)输出单个字符. putchar('\n'); // 支持转义换行 putchar(77); // 可以直接注入AS ...
- 【SpringBoot】06 探索配置方式 Part2 占位符的使用
配置占位符? 随机数配置生成 RandomValuePropertySource 在配置文件中使用随机数 uid = ${random.value} uid = ${random.int} uid = ...
- 【MacOS】VMware安装10.15-Catalina版本
参考自: https://www.bilibili.com/video/BV1sf4y1D77A?p=4 资源地址: https://pan.baidu.com/s/1U6WOorb_TuORQ9ab ...