第一题 Least squares
关于这一道题,使用scipy
库中的leastsq函数即可求解。
第一步:先生成可用的矩阵和向量
在本题中,我需要先生成矩阵 ,向量 ,考虑到后期该问题需要有解,向量 不随机生成,而是先随机生成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)
求得的结果是
经过绘图检验,可见的确是在 左右这个点处取得最大值。
第三题 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 ), 其余的结果也是正确的。