scipy包含各种科学计算
数据分析的工具
下载数据集遇到的问题:Kaggle网站注册用户刷不出验证界面。这里需要安装谷歌访问助手,百度一下有很多解答。
scipy 库是 numpy 基础上增加的众多数学,科学以及工程计算常用的的库函数,例如线性代数,常微分方程,信号处理,图像处理,稀疏矩阵 等
scipy的应用范围:线性代数、常微分方程、信号处理、图形处理、矩阵等
本次有关内容为:积分、优化器、插值、线性计算与矩阵分解。
#encoding=utf-8
'''
scipy函数库是numpy基础上增加了众多数学、科学以及工程计算常用的库函数
例如线性代数、常微分方程、信号处理、图像处理,稀疏矩阵等
关键字:数据计算库
官网:https://www.scipy.org/
'''
import numpy as np
from pylab import *#引入一个绘图模块,是matplotlib的常用函数
def main():
#1- scipy积分 Integral
from scipy.integrate import quad,dblquad,nquad
#quad是积分模块,nquad表示n维积分
#在数学分析中,给定函数的定积分的计算不总是可行的
#数值积分是利用黎曼积分等数学定义,用数值逼近的方法近似计算给定的定积分值。
print(quad(lambda x:np.exp(-x),0,np.inf))#用quad定义一个lambda函数,exp指对数,x范围是从0到无穷大
#得(1.0000000000000002, 5.842607038578007e-11) 数值积分是计算出一个值和一个误差,最终的值在前面结果+—右边范围之间
print(dblquad(lambda t,x:np.exp(-x*t)/t**3,0,np.inf,lambda x:1,lambda x:np.inf))
#先定义t的取值范围可以用常数表示,再定义x的取值范围因为x相当于是t的函数,所以用函数定义
#得结果(0.3333333333366853, 1.3888461883425516e-08)
def f(x,y):#定义一个函数
return x*y
def bound_y():#定义y的取值范围
return [0,0.5]
def bound_x(y):#定义x的边界,由y得到的范围
return [0,1-2*y]
print(nquad(f,[bound_x,bound_y]))#得值得取值范围(0.010416666666666668, 4.101620128472366e-16)
#scipy优化器Optimizer
from scipy.optimize import minimize#引入一个计算最小值的模块
def rosen(x):
return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0+(1-x[:-1])**2.0)
x0=np.array([1.3,0.7,0.8,1.9,1.2]) #想用optimizer算法的话需要
res=minimize(rosen,x0,method="nelder-mead",options={"xtol":1e-8,"disp":True})
#计算rosen的最小值,method使用的nelder-mead算法,以动5个点为基础,不断地去掉得到最高的点,然后优化成最小值
#xtol表示精度,disp:True表示显示中间过程
print("ROSE MINI:",res)#打印出结果和中间过程
print("ROSE MINI:",res.x)#打印出属性
#求在约束条件下目标函数的最小值
def func(x):#这里x可以是任何参数
return -(2*x[0]*x[1]+2*x[0]-x[0]**2-2*x[1]**2)
def func_deriv(x):#表示定义的原函数即目标函数相对于x和相对于y的颠倒数
dfdx0=-(-2*x[0]+2*x[1]+2)#相对于x的倒数
dfdx1=-(2*x[0]-4*x[1])#相对于y的倒数
return np.array([dfdx0,dfdx1])
#下面定义一个约束条件,分别是相等于0,jac表示求偏导,直接给出偏导式而不是计算机计算可以提高计算速度
cons=({"type":"eq","fun":lambda x:np.array([x[0]**3-x[1]]),"jac":lambda x:np.array([3.0*(x[0]**2.0),-1.0])},
{'type':'ineq','fun':lambda x:np.array([x[1]-1]),'jac':lambda x:np.array([0.0,1.0])})
res=minimize(func,[-1.0,1.0],jac=func_deriv,constraints=cons,method='SLSQP',options={'disp':True})
#目标函数func,取值范围-1到1,jac表示雅克比行列式,constraints表示约束条件,method表示方法,disp:True表示显示中间过程
print("RESTRICT:",res)#在x: array([ 1.00000009, 1.])的时候取到最小值
#还可以用优化器求根
from scipy.optimize import root
def fun(x):
return x+2*np.cos(x)
sol=root(fun,0.1)#指定初值0.1,求根
print("ROOT:",sol.x,sol.fun)#得结果x:array([ 1.00000009,1. ]) ROOT: [-1.02986653] [ 0.]
#scipy插值Interpolation
x=np.linspace(0,1,10)#定义10个数
y=np.sin(2*np.pi*x)
from scipy.interpolate import interp1d#引入插值算法,以一维插值为例
li=interp1d(x,y,kind="cubic")#如果不写任何函数则以线性函数插值,kind=cubic表示三次函数插值
x_new=np.linspace(0,1,50)#定义50个数
y_new=li(x_new)#l插值算法返回的是函数,输入自变量可得算法的值
figure()#画出来
plot(x,y,"r")#用红色表示原数据,因为只有十个数显得比较折线
plot(x_new,y_new,"k")#用黑色表示新的数据,因为插入新的数,所以线平滑了很多
show()
print(y_new)
#scipy线性计算与矩阵分解 Linear
from scipy import linalg as lg
arr=np.array([[1,2],[3,4]])
print("Det:",lg.det(arr))#计算行列式,得-2.0
print("Inv:",lg.inv(arr))#计算幂矩阵,得Inv: [[-2. 1. ] [ 1.5 -0.5]]
b=np.array([6,14])
print("Sol:",lg.solve(arr,b))#用scipy解线性方程组的,左边是未知数的因子,右边是相等的值,得 [ 2. 2.]
print("Eig:",lg.eig(arr))#计算特征值,得(array([-0.37228132+0.j, 5.37228132+0.j]), array([[-0.82456484, -0.41597356], [ 0.56576746, -0.90937671]]))
print("LU:",lg.lu(arr))#用scipy进行矩阵分解,得(array([[ 0., 1.], [ 1., 0.]]), array([[ 1. , 0. ],[ 0.33333333, 1. ]]), array([[ 3. , 4. ], [ 0. , 0.66666667]]))
print("QR:",lg.qr(arr))#QR分解,得(array([[-0.31622777, -0.9486833 ], [-0.9486833 , 0.31622777]]), array([[-3.16227766, -4.42718872],[ 0. , -0.63245553]]))
print("SVD:",lg.svd(arr))#奇异值分解,得(array([[-0.40455358, -0.9145143 ],[-0.9145143 , 0.40455358]]), array([ 5.4649857 , 0.36596619]), array([[-0.57604844, -0.81741556],[ 0.81741556, -0.57604844]]))
print("Schur:", lg.schur(arr))#Schur分解,得(array([[-0.37228132, -1. ], [ 0. , 5.37228132]]), array([[-0.82456484, -0.56576746], [ 0.56576746, -0.82456484]]))
#scipy的学习方法
'''
官网:https://www.scipy.org/--->Documentation--->Scipy的
Tutorial里面有一些单元
比如基本的函数,特殊的函数,积分,优化器,插值,fft,信号处理包括滤波器的设计,线性矩阵,稀疏矩阵稀疏图,空间坐标器,统计功能,图形处理功能,子文件处理功能
Api接口
'''
if __name__=='__main__':
main()
scipy 库是 numpy 基础上增加的众多数学,科学以及工程计算常用的的库函数,例如线性代数,常微分方程,信号处理,图像处理,稀疏矩阵 等
数值计算库
scipy的应用范围:线性代数、常微分方程、信号处理、图形处理、矩阵等
本次有关内容为:积分、优化器、插值、线性计算与矩阵分解。
scipy官网