scipy题目(高级编程技术 week-13)

第一题 Least squares

关于这一道题,使用scipy库中的leastsq函数即可求解。

第一步:先生成可用的矩阵和向量

在本题中,我需要先生成矩阵 A A ,向量b,考虑到后期该问题需要有解,向量 b b 不随机生成,而是先随机生成x,然后算出b。代码如下

import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
# 维数
m = 20
n = 10
# 生成矩阵A
A = np.random.normal(size=(m,n), scale=15, loc=10)
# 生成假想的该问题应有的解
xx = np.random.normal(size=n,scale=15, loc=10)
# 生成该解对应的向量b
b = np.dot(A, xx)

在生成了可用的数据后,便使用leastsq函数解决问题,代码如下

from scipy.optimize import leastsq
# 问题求解初始向量
x = np.ones(10)
# 误差函数
def error(xx):
    return np.dot(A, xx) - b

x_result,cov_x = leastsq(error, x)

print(x_result, cov_x)
# 计算误差向量的范数
norm_residual = np.linalg.norm(np.dot(A, x_result) - b)
print(norm_residual)

运行以上代码后,可以得到下面的解:

第二题 Optimization

求函数最大值,使用scipy自带的fmin函数即可,这里稍微转换一下,由于只有fmin这个函数可用,而我们找的又是最大值,我们就只需要给函数加个负数,就变成了求最小值,这样子就把问题转换过来了。下面是代码:

def func(x):
    return -(np.sin(x-2) * np.sin(x-2) * np.exp(-x**2))
minimum = sp.optimize.fmin(func, 1)
print(minimum)

求得的结果是

经过绘图检验,可见的确是在x0.2162左右这个点处取得最大值。

第三题 Pairwise distances

在scipy文档中,找到了这样的函数可以实现计算行之间的距离的功能:pdist

因此实现的代码如下:

from scipy.spatial.distance import pdist
m = 30
n = 20
X = np.random.normal(size=(n, m), scale=10, loc=10)
Y = pdist(X, 'sqeuclidean')
print(Y.shape)
print(Y)

注意,这里需要说明的数,这里使用的是欧拉距离公式,因此在函数参数中有一个sqeuclidean的项。

文档内容可见

结果可见

经过检验,的确应该是190个数(毕竟 20 * 19 /2 ), 其余的结果也是正确的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值