本週需要學習如何使用scipy。scipy中包含了許多跟numpy一樣的函式,因此使用起來會有許多相似之處。
exercise 10.1: least squares
生成乙個m行n列的矩陣,並要求m>n。同時生成乙個m維向量。
求解x = arg minx ||ax - b||2.
該題可以使用lstsq來求解,scipy.linalg.lstsq使用引數跟numpy.linalg.lstsq一致。
import numpy
import numpy.matlib
import scipy.linalg
m = 5
n = 3
a = numpy.matlib.rand((m, n))
b = numpy.matlib.rand((m, 1))
x = scipy.linalg.lstsq(a, b)[0]
print("a")
print(a)
print("b")
print(b)
print("x")
print(x)
結果如下
a
[[0.92962385 0.05363313 0.50548348]
[0.95964889 0.56054093 0.58568573]
[0.32413643 0.20750581 0.26737541]
[0.77044965 0.53036492 0.04242422]
[0.30828577 0.24769184 0.88993455]]
b[[0.7871204 ]
[0.87042653]
[0.7409384 ]
[0.490697 ]
[0.87699647]]
x[[0.3817007 ]
[0.28595985]
[0.80332776]]
exercise 10.2: optimization
尋找函式f(x) = sin^2(x - 2)e^-x2的最大值。
scipy.optimize.minimize可以求解出某個函式的最小值,然而本題需要求解的是最大值,因此需要將其取反,此時最小值就是原函式的最大值了。並且該方法需要使用乙個可呼叫函式來作為引數,一般情況下函式需要使用def來定義,然而也可以使用lambda來實現matlab中的@(x)f(x)一樣的匿名函式。
import math
import scipy.optimize
f = lambda x: - pow(math.sin(x - 2), 2) * math.exp(-pow(x, 2))
y = scipy.optimize.minimize(f, 0)
print(y)
結果如下
fun: -0.9116854118471545
hess_inv: array([[0.2680098]])
jac: array([-1.49011612e-08])
message: 'optimization terminated successfully.'
nfev: 18
nit: 4
njev: 6
status: 0
success: true
x: array([0.21624132])
由於我們對函式進行了取反,因此fun顯示的最小值取反後為原函式的最大值。
可以看到,當x=0.21624132時,f取最大值,為0.9116854118471545。
exercise 10.3: pairwise distances
生成乙個n行m列的矩陣,計算每兩行之間的距離。
給出乙個應用例子就是,由n座城市,用兩列的方式給定他們的座標,使用乙個**來記錄每兩座城市之間的距離。
計算距離通常使用幾何距離,也就是歐幾里得距離。
import numpy
import numpy.matlib
import scipy.spatial.distance
n = 5
m = 6
x = numpy.matlib.rand((n, m))
dist = numpy.zeros((n, n))
for i in range(0, n):
for j in range(0, n):
dist[i][j] = scipy.spatial.distance.euclidean(x[i], x[j])
print("x")
print(x)
print("")
print("dist")
print(dist)
結果如下
x
[[0.20273567 0.25231566 0.44017816 0.70797027 0.1422286 0.42647038]
[0.1075678 0.498664 0.14429584 0.76133804 0.48465502 0.37378304]
[0.40225683 0.97926513 0.68925144 0.85595932 0.10464522 0.44246778]
[0.29966126 0.54135749 0.66086263 0.78189069 0.07700883 0.78110347]
[0.7007273 0.4551945 0.69823013 0.48250564 0.27664712 0.14748214]]
dist
[[0. 0.52931154 0.80862285 0.52642555 0.70886063]
[0.52931154 0. 0.87913248 0.79879386 0.91257761]
[0.80862285 0.87913248 0. 0.56922661 0.78732718]
[0.52642555 0.79879386 0.56922661 0. 0.83704073]
[0.70886063 0.91257761 0.78732718 0.83704073 0. ]]
高階程式設計技術第十三次作業
64 minimum path sum class solution def minpathsum self,grid row len grid cow len grid 0 list 0 cow row if row 0 cow 0 return 0 for i in range row for ...
高階程式設計技術 第十二周作業
本週講了matplotlib,乙個用於繪製影象的庫。要求用numpy和matplotlib來完成三道練習題。在區間 0,2 上繪製函式f x sin 2 x 2 e x 2 要求加上軸標籤和標題。matplotlib的畫圖用法跟matlib基本一樣,因此只需要按照matlib的步驟來繪製影象即可。由...
高階程式設計技術 第十五周作業
本週簡單介紹了以下sklearn這個庫,簡單來說sklearn是基於numpy scipy等基礎數學庫的乙個機器學習庫,提供了幾種機器學習演算法。create a classification dataset n samples 1000,n features 10 split the datase...