SciPy基础入门(二)
SciPy线性代数-linalg
Numpy和sciPy都提供了线性代数函数库linalg,SciPy更为全面:解线性方程组、最小二乘解、特征值和特征向量、奇异值分解...等。
解线性方程组解线性方程组
import numpy as np
from scipy import linalg
import timeit
m,n = 50,50
A = np.random.rand(m,n)
B = np.random.rand(m,n)
def my_func1():
X1 = linalg.solve(A,B)
def my_func2():
X2 = np.dot(linalg.inv(A),B)
t1 = timeit.Timer(stmt=my_func1).timeit(number=100)
t2 = timeit.Timer(stmt=my_func2).timeit(number=100)
print(t1,t2)
特征值和特征向量
n x n的矩阵A可以看作n维空间中的线性变换。
如果x为n维空间中的一个向量,那么A与x的矩阵乘积是对x进行线性变换之后的向量。
如果x是线性变换的特征向量,那么经过这个线性变换后,得到新向量仍与原来的x保持在同乙方向上,长度可能发生改变。
特征向量的长度在该线性变换下缩放的比例称为其特征值。
#特征值和特征向量-举例
A = np.array([[1,-0.3],[-0.1,0.9]])
evalues,evectors = linalg.eig(A)
print(evalues)#特征值
print(evectors)#特征向量
奇异值分解-SVD
Linalg库中的svd函数:对矩阵进行奇异值分解。其调用形式为:U,s,V = scd(M)
#奇异值分解--举例
A = np.array([[1,-0.3],[-0.1,0.9]])
U,s,V = linalg.svd(A)
print(U)
print(s)
print(V)
SciPy的stats模块
Stats模块包含了多种概率分布的随机变量
连续随机变量是rv_continuous派生类的对象
离散随机变量是rv_discrete派生类的对象
连续概率分布、离散概率分布、核密度估计、二项分布、泊松部分、伽马分布、学生t-分布与t检验、卡方分布和卡方检验
连续概率分布连续随机变量对象方法
以正态分布为例,获取默认正态分布随机变量的期望值和方差:
stats.norm.stats()
Norm可以像函数一样使用,通过loc和scale参数可以指定随机变量的偏移和缩放参数。
X.stats.norm(loc=1.0,scale=2.0)
X.stats()
调用随机变量x的rvs()方法,得到包含一万次随机取样值的数组x:
x = X.rvs(size = 10000)#对随机变量取1000个值
import numpy as np
np.mean(x)
np.var(x)
使用mean()、var()计算此数组的均差和方差,其结果符合随机变量x的特性
离散概率分布
当分布函数的值域为离散时称之为离散概率分布
例如:投掷有六个面的骰子时,获得1到6的整数,因此所得到的概率分布为离散的
stats模块中离散分布随机变量都从rv_discrete类继承,也可以直接用rv_discrete类自定义离散概率分布。投掷骰子举例:
1.数组x保存骰子的所有可能值
2.数组p保存每个值出现的概率
3.创建表示这个骰子的随机变量dice
from scipy import stats
x = range(1,7)
p = (1.0/6,1.0/6,1.0/6,1.0/6,1.0/6,1.0/6)
dice = stats.rv_discrete(values=(x,p))
dice.rvs(size=20) #投掷此骰子20次,获得符合概率p的随机数
中心极限定律:大量相互独立的随机变量,其均值的分布以正态分布为极限。如何验证?
由于每一次投掷骰子可以看作一个独立的随机事件,投掷骰子50次的平均值可以看作“大量相互独立的随机变量”,其平均值的分布应该十分接近正态分布。
import numpy as np
samples = dice.rvs(size=(20000,50))
samples_mean = np.mean(samples,axis=1)
print(samples)
print(samples_mean)
核密度估计-举例
1.前面例子中每个点是离散的,因此平均值也是离散的(直方图来显示)
2.更平滑的显示样本的概率,进行kde.gaussian_kde()进行核密度估计
3.核密度估计与拟合的正态分布十分相似
核密度估计-举例核密度估计-举例
SciPy数值积分-integtate
integtate模块提供了几种数值积分算法,包括对常微分方程组(ODE)的数值积分。
计算球体体积、解常微分方程
球的体积求解球的体积求解-面积求解 球的体积求解-面积求解
球的体积求解
多重定积分可以通过多次调用quad()实现。integrage提供了:二重定积分 dblquad()、三重定积分 tplquad()
球的体积求解 球的体积求解 球的体积求解 球的体积求解 球的体积求解解常微分方程