需要源码请点赞关注收藏后评论区留言私信~~~
一、Scipy中的优化
SciPy.optimize包提供了几种常用的优化算法,包括用来求有/无约束的多元标量函数最小值算法,最小二乘法,求有/无约束的单变量函数最小值算法,还有解各种复杂方程的算法
1. 方程求解及求极值
使用SciPy.optimize模块的root和fsolve函数进行数值求解线性及非线性方程求方程的根
利用root函数求方程的解
from scipy.optimize import root def func(x): return x*2 + 2 * np.cos(x) sol = root(func, 0.3) # 0.3 估计初始值 print (sol)
使用fmin,fminbound可以求函数的极值
函数极值求解
import numpy as np from matplotlib import pyplot as plt from scipy.optimize import fmin,fminbound def f(x): return x**2+10*np.sin(x)+1 x = np.linspace(-10,10,num = 500) min1 = fmin(f,3) #求3附近的极小值 min2 = fmin(f,0) #求0附近的极小值 min_global = fminbound(f,-10,10) #这个区域的最小值 print(min1) print(min2) print(min_global) plt.plot(x,f(x)) plt.show()
2 数据拟合
(1)多项式拟合
多项式拟合
import matplotlib.pyplot as plt x = np.linspace(-5,5,20) y = 3.5*x+2.1 y_noise = y+np.random.randn(20)*2 coeff = np.polyfit(x,y_noise,1) plt.plot(x,y_noise,'x',x,coeff[0]*x+coeff[1]) plt.show()
分别使用1阶、3阶和9阶多项式对数据进行拟合
x = np.linspace(0,np.pi*2) y = np.sin(x) f1 = np.poly1d(np.polyfit(x,y,1)) f3 = np.poly1d(np.polyfit(x,y,3)) f9 = np.poly1d(np.polyfit(x,y,9)) t = np.linspace(-3*np.pi,np.pi*3,80) plt.plot(x,y,'x',t,f1(t),':',t,f3(t),'--',t,f9(t),'-.') plt.axis([0,3*np.pi,-1.5,1.5]) plt.legend(['data',r'$n = 1$',r'$n = 3$',r'$n = 9$']) plt.show()
(2)最小二乘拟合
最小二乘拟合(Least Squares)是一种常用的数学优化技术,通过最小化误差的平方和在寻找一个与数据匹配的最佳函数
要使用最小二乘优化,需要先定义误差函数
其中,p表示要估计的真实参数,x是函数的输入,y表示输入对应的数据值。最小二乘估计对应的函数为optimize.leastsq(),可以利用该函数和定义的误差函数,对真实参数进行最小二乘估计
最小二乘估计示例
from scipy import optimize def myfunc(x,a,b,w,t): return a*np.exp(-b*np.sin(w*x+t)) x = np.linspace(0,2*np.pi) par = [3,2,1.25,np.pi/4] y = myfunc(x,*par) y_noise = y+0.8*np.random.randn(len(y)) def errf(p,x,y): return y-myfunc(x,*p) c,rv = optimize.leastsq(errf,[1,1,1,1],args = (x,y_noise)) #c返回找到的最小二乘估计 plt.plot(x,y_noise,'x',x,y,x,myfunc(x,*c),':') plt.legend(['data','actual','leastsq']) plt.show()
(3)曲线拟合
可以不定义误差函数,用函数optimize.curve_fit()直接对函数myfunc的参数直接进行拟合
曲线拟合示例
p,e = optimize.curve_fit(myfunc,x,y_noise) print('p是对参数的估计值:\n',p) print('e是4个估计参数的协方差矩阵:\n',e)
二、Scipy中的稀疏矩阵处理
1 稀疏矩阵的存储
稀疏矩阵(Sparse Matrix)是只有少部分元素值是非零的矩阵。如果按照正常方式存储所有元素,则这些矩阵将占用巨大空间,因此,稀疏矩阵只保存非零值及对应的位置
bsr_matrix(Block Sparse Row matrix):分块存储,基于行
coo_matrix(A sparse matrix in COOrdinate format):坐标形式存储(COO)
csr_matrix(Compressed Sparse Row matrix):基于行的压缩存储(CSR)
dia_matrix(Sparse matrix with DIAgonal storage):对角线存储
dok_matrix(Ditictionary Of Keys based sparse matrix):基于键值对的存储
lil_matrix(Row-based linked list sparse matrix):基于行的链表存储
在这些存储格式中,COO方式在构建矩阵时比较高效,而CSC和CSR方式在乘法运算时效率较高
2 稀疏矩阵的运算
由于稀疏矩阵数据量大,一般不使用普通矩阵作为参数来构建,而是采用非零数据点及坐标的形式构建
稀疏矩阵的基本运算
import numpy as np from scipy import sparse sparse.coo_matrix((2,3)) #创建空的稀疏矩阵 A = sparse.coo_matrix([[1,2,0],[0,1,0],[2,0,0]]) print(A) #将普通矩阵转为稀疏矩阵 print(type(A)) #查看A的类型 print(type(A.tocsc())) #不同类型的稀疏矩阵可以相互转换 v = np.array([1,3,-3]) print(A*v)
稀疏矩阵的构建
data = np.array([1,2,3,4]) rows = np.array([0,0,1,2]) cols = np.array([0,1,2,2]) W = sparse.coo_matrix((data,(rows,cols))) print('稀疏矩阵W:\n',W) r,c,d = sparse.find(W) #find()函数返回非零元素的行、列和具体数值 print('稀疏矩阵W非零值:\n',r,c,d)
创作不易 觉得有帮助请点赞关注收藏~~~