Scipy 练习

这道题要求使用最小二乘法找到这个x并且输出残差的范数,程序如下:

import scipy
from scipy import linalg
from scipy.optimize import leastsq

A = scipy.random.normal(size=[30, 20])
b = scipy.random.normal(size=[30])


def error(x, A, b):
    return scipy.matmul(A, x) - b


#产生x的初始值
x = scipy.random.normal(size=[20])

# 把error函数中除了x以外的参数打包到args中(使用要求)
Para = leastsq(error, x, args=(A, b))

#求解出x
x = Para[0]
print(linalg.norm(scipy.matmul(A, x) - b))

思路解析:先用scipy自带的random库生成向量和矩阵还有x的初始解,最后定义损失函数error,然后使用leastsq函数求出相应的解

scipy.optimize.leastsq(func, x0, args=(), Dfun=None, full_output=0, col_deriv=0, ftol=1.49012e-08, xtol=1.49012e-08, gtol=0.0, maxfev=0, epsfcn=None, factor=100, diag=None)
在leastsq函数原型中,func是自定义的损失函数,但要注意leastsq这个函数是
min  sum((ydata - f(xdata, params))**2, axis=0)

所以在func中不需要平方和求和,leastsq函数自己会进行计算

X0是解的初始值,args是指定函数(func)的其他参数

运行截图:





第二题是找这个函数的最大值

from scipy.optimize import basinhopping
import scipy

func = lambda x: -scipy.power(scipy.sin(x[0]-2), 2)*scipy.power(scipy.e, -x[0]**2)
x0=[1.]
minimizer_kwargs = {"method": "BFGS"}
ret = basinhopping(func, x0, minimizer_kwargs=minimizer_kwargs,
                    niter=200)
print("global minimum: x = %.4f, f(x0) = %.4f" % (ret.x, ret.fun))

这里我选用的是optimize里的basinhopping函数,为了求sin2(x2)ex2最大值相当于求

sin2(x2)ex2

的最小值  


 最后报出ComplexWarning是在将复数转换为实数时丢弃了虚部导致


basinhopping 函数可以求一个函数的全局最小值,通过使用basin-hopping 算法。

scipy.optimize.basinhopping(func, x0, niter=100, T=1.0, stepsize=0.5, minimizer_kwargs=None, take_step=None, accept_test=None, callback=None, interval=50, disp=False, niter_success=None, seed=None

里面的func参数即为需要确定最小值的函数,x0是初始解,niter是basin-hopping算法的迭代次数

minimizer_kwargs包括了用来求解局部最小值所用到的算法等



第三题是求两两之间的距离

import scipy
from scipy.spatial.distance import cdist
from scipy import linalg

x = scipy.random.normal(size=[20, 20])*10 + scipy.random.randint(-10, 10)
distance = cdist(x, x, metric='Euclidean')

for i in range(20):
    for j in range(20):
        distance_ij = linalg.norm(x[i]-x[j], 2)
        if abs(distance_ij - distance[i][j]) > 1e-4:
            print('wrong')

这里我使用了python的cdist函数,这个函数计算第一个参数的每一行到第二个参数的每一行的距离,第三个参数是度量,常见的距离有欧几里得距离、马氏距离等

distance[i][j]即是第一个参数的第i行到第二个参数的第j行的距离

最后写了一个循环确定结果没错



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值