高階程式設計技術 第十三周作業

2021-08-20 12:29:26 字數 3196 閱讀 5120

本週需要學習如何使用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...