以下是用jupyter notebook导出markdown格式的文件,对应输入输出。。
import numpy as np
from scipy.linalg import toeplitz
n = 200
m = 500
A = np.random.randn(n, m)
B = toeplitz(np.arange(m))
I = np.eye(m,m)
print(A)
print(B)
[[-0.86046243 0.30115977 0.73137673 ... 0.26170828 0.03007832
0.28088492]
[-1.56096201 0.38153494 0.94719265 ... 0.4708248 0.75180722
0.71232127]
[ 1.42251073 -0.39533632 -0.94342822 ... 1.78528343 -0.4857231
1.5061549 ]
...
[ 1.05913795 0.99815423 -0.58212395 ... 0.78615985 1.7645259
-0.38811833]
[-0.04473702 -1.32534125 -1.04852523 ... 1.6435978 -0.83361505
0.74616691]
[ 0.92317299 -1.74689381 0.00678095 ... -0.14099563 -0.63853128
1.33323736]]
[[ 0 1 2 ... 497 498 499]
[ 1 0 1 ... 496 497 498]
[ 2 1 0 ... 495 496 497]
...
[497 496 495 ... 0 1 2]
[498 497 496 ... 1 0 1]
[499 498 497 ... 2 1 0]]
# 9-1
print(A+A)
print(A.dot(A.T))
print(A.T.dot(A))
print(A.dot(B))
def fun(lam):
return A.dot(B-lam*I)
print(fun(0))
[[-1.72092486 0.60231954 1.46275347 ... 0.52341655 0.06015663
0.56176985]
[-3.12192403 0.76306988 1.8943853 ... 0.94164959 1.50361443
1.42464254]
[ 2.84502146 -0.79067263 -1.88685644 ... 3.57056685 -0.9714462
3.0123098 ]
...
[ 2.11827591 1.99630846 -1.16424789 ... 1.5723197 3.5290518
-0.77623667]
[-0.08947404 -2.6506825 -2.09705046 ... 3.2871956 -1.6672301
1.49233382]
[ 1.84634599 -3.49378763 0.0135619 ... -0.28199127 -1.27706257
2.66647472]]
[[ 4.60459662e+02 -6.59171865e+00 2.31387015e+01 ... -3.14030630e+01
3.13833163e+01 1.72963541e+01]
[-6.59171865e+00 4.75035650e+02 -4.67409024e-01 ... -3.15015782e+01
1.71846976e+01 -1.58875658e+01]
[ 2.31387015e+01 -4.67409024e-01 5.06260314e+02 ... 7.58211265e+00
-6.48590504e+00 -3.49405038e+01]
...
[-3.14030630e+01 -3.15015782e+01 7.58211265e+00 ... 5.00322332e+02
5.55502279e+00 -1.51972999e+01]
[ 3.13833163e+01 1.71846976e+01 -6.48590504e+00 ... 5.55502279e+00
4.53036925e+02 1.58968613e+01]
[ 1.72963541e+01 -1.58875658e+01 -3.49405038e+01 ... -1.51972999e+01
1.58968613e+01 4.98077903e+02]]
[[170.60024071 -8.19664975 -1.39613034 ... 6.81915464 -19.16736005
20.48386654]
[ -8.19664975 190.65199199 -30.79685959 ... -12.60684667 6.52993606
-32.76131853]
[ -1.39613034 -30.79685959 239.94280849 ... 18.08559623 -5.27976432
12.776076 ]
...
[ 6.81915464 -12.60684667 18.08559623 ... 189.20155784 -12.97770174
12.90892766]
[-19.16736005 6.52993606 -5.27976432 ... -12.97770174 185.2300201
-5.7624913 ]
[ 20.48386654 -32.76131853 12.776076 ... 12.90892766 -5.7624913
218.03749133]]
[[ -8204.15088328 -8167.43167144 -8130.11014006 ... -10899.41336217
-10938.47542536 -10977.47733191]
[ -6252.27445976 -6216.85303327 -6180.66853689 ... -12899.41784739
-12940.88945487 -12980.85744793]
[ -9164.24925645 -9133.76879228 -9104.07900074 ... -4565.5125987
-4595.18890501 -4625.83665752]
...
[ -7666.18699282 -7641.96393659 -7615.74457189 ... -3317.91225014
-3342.76984559 -3364.09838925]
[ 11476.21643174 11441.38716755 11403.90722085 ... 5790.77671421
5825.69140064 5858.93885698]
[-14116.77221181 -14073.26792173 -14033.25741927 ... -6583.17011629
-6626.21747254 -6670.54189135]]
[[ -8204.15088328 -8167.43167144 -8130.11014006 ... -10899.41336217
-10938.47542536 -10977.47733191]
[ -6252.27445976 -6216.85303327 -6180.66853689 ... -12899.41784739
-12940.88945487 -12980.85744793]
[ -9164.24925645 -9133.76879228 -9104.07900074 ... -4565.5125987
-4595.18890501 -4625.83665752]
...
[ -7666.18699282 -7641.96393659 -7615.74457189 ... -3317.91225014
-3342.76984559 -3364.09838925]
[ 11476.21643174 11441.38716755 11403.90722085 ... 5790.77671421
5825.69140064 5858.93885698]
[-14116.77221181 -14073.26792173 -14033.25741927 ... -6583.17011629
-6626.21747254 -6670.54189135]]
# 9-2
b = np.random.randn(500)
x = np.linalg.solve(B, b)
print(x)
print(np.allclose(B.dot(x), b)) # check
[ 0.34156541 -0.59838842 -0.69863765 2.2177078 -1.71426284 0.60160113
-0.08123093 -1.04514497 2.14338057 -2.08471981 1.05511105 -0.20720298
0.89899909 -0.60645555 -0.94114286 0.94843828 -0.48530495 0.59849954
-1.66829446 2.4068125 -1.00505613 0.60751204 -1.72928608 0.79343925
0.41611878 0.63381989 -1.26655123 1.11008529 -1.64580294 1.34150019
0.32939085 -1.1707536 0.28755129 0.96087753 -2.5846774 3.85138366
-3.75157578 3.24681493 -2.64312385 1.37100932 -0.16829174 0.85135533
-1.12659886 -0.28634517 0.33425479 0.84053004 -1.71859535 1.84786072
0.02592074 -2.38383254 1.15815998 1.46766007 -1.21097662 -0.10277406
0.03385079 0.32526459 -0.51024767 0.71506732 -0.43330118 0.1266056
1.09764117 -0.97467138 -1.14903006 1.14529311 -0.53371147 1.01207679
-0.62693187 -0.86464203 1.51124958 -0.44554219 -0.30136711 0.44769874
-1.18758408 1.27179077 -1.03151862 1.83372289 -2.07292541 1.63531945
-2.05744442 3.18552611 -2.39434895 -0.15261197 0.1673338 0.93126758
-0.36292824 0.53265032 -1.57366496 1.1018216 -0.31415441 -0.02281922
-0.09144119 0.28021082 1.59001906 -2.90065869 1.05735563 1.04200832
-0.66691729 -1.07279425 1.59373299 -0.78270436 -0.5727265 1.86466217
-1.00444168 -0.02852198 -1.03296517 0.51421067 0.20451499 1.55369215
-1.82077108 0.54800507 -0.28200318 -0.5438969 0.27557521 1.80935781
-2.14768322 1.26393372 -0.27069527 0.25546978 -0.22643729 -1.21849322
1.61825702 -1.10981389 0.12673486 -0.28443505 1.43262434 -1.01156838
1.48676287 -2.11283902 1.92083208 -2.29529317 1.22435558 0.75626661
-1.61366276 0.32675002 1.58826808 -2.77256675 2.77471106 0.12608803
-1.69317745 0.15528647 -0.16552686 0.87617642 0.9412579 -2.10132217
0.56074985 -0.5035707 1.26104461 -1.30152423 1.54262041 -0.50001849
-0.47689514 -0.43812624 1.75884911 -1.97557151 1.7107997 -0.72248803
-1.41766538 1.3380366 -0.33069671 1.41300331 -1.81611232 1.0839304
-0.76684084 -0.03746894 0.70180032 -0.12425946 0.27703459 -0.79256402
0.2942678 0.26365155 0.724171 -1.76027033 0.58378426 0.99667549
-1.04845587 0.18146377 0.37403325 0.24948489 -1.86077324 1.86206855
-0.85995219 0.16231458 0.3294451 0.85943916 -2.37634141 2.72029256
-1.58247721 -0.72601986 1.28565597 -0.43521297 -0.22721467 1.44715012
-2.17588492 1.90828257 -1.03033663 0.68898799 -1.55821097 1.39380052
0.37822104 -0.85513248 0.24800903 -1.67969958 1.87618123 0.32405252
-1.12950766 1.28559676 -0.45388576 -0.68435023 0.49162092 -0.67399739
0.59267946 0.52306441 -1.28661392 0.69061397 0.11734533 0.72018065
-1.32241079 0.47826178 -0.1683024 0.1657361 -0.95947288 2.46997163
-2.27095878 1.36270791 -0.97158302 0.86671583 -0.84554801 0.56790126
-0.74263289 1.29768637 -0.75824043 -0.86856369 2.0577082 -2.57463695
2.65963398 -2.0424014 0.27490446 1.09719302 -1.31210679 0.98256303
0.21968835 -1.36111269 1.12553232 -0.04150628 0.17689491 0.36515181
-0.87380163 0.28402759 -1.42818975 2.19754095 -1.05025559 -0.40864136
1.46398915 -2.78862308 3.15084386 -1.90468811 0.86304183 0.12462147
-0.6445501 0.59540538 -0.44205218 0.52894962 -1.04537404 0.47625821
-0.08558042 0.59253998 -0.40127618 -0.55490411 2.28608448 -2.84482747
1.42320585 -0.30907979 -0.04704665 0.12860309 0.20052449 -0.80062343
0.74430056 -0.10058188 1.19504991 -2.35200754 0.66756646 0.84339104
0.05561061 -1.49399372 1.97069584 -0.77992049 -1.2368819 1.54595754
-0.28822676 -0.30750473 -0.48653863 0.59152563 -0.53123406 1.64120531
-0.87343746 -0.82325915 0.62989691 -0.29676138 -0.08836218 0.17371301
0.92016565 -1.21696181 0.7660736 0.13310717 -0.81374741 0.54431283
0.54761566 -1.96120495 3.06339999 -2.99819699 0.94614857 0.58584985
-0.19731397 -0.79435174 0.93653047 0.10940575 -1.48536626 1.41680161
0.31327767 -1.5246428 1.12500351 -0.70645974 0.8689473 0.40946218
-1.19283247 -0.51411542 2.22020469 -2.24801049 0.75015751 0.80907955
-0.95853305 0.12834143 0.5540963 0.11266835 -1.04432941 0.84748076
0.20440754 -1.12818634 -0.60869005 2.50200539 -1.33300852 -0.72406018
1.26197374 0.59164594 -1.26014457 -0.46873745 0.35278827 0.07985866
1.20769344 -1.57427533 1.51552836 -1.48519798 -0.36287936 1.34612422
-0.60704704 1.30322825 -2.09940237 1.3863973 -0.47202322 0.17909836
-0.06890619 -0.21596016 0.17573463 0.92467198 -2.28371087 2.29240573
-0.99654663 0.62410581 -1.16613899 0.89222017 -1.3880017 1.59308222
-0.76642739 0.31914961 -0.09640893 0.72454576 -0.80262885 0.1008478
0.35081987 -0.39803588 -0.04157775 -0.08484636 0.13570158 -0.11885937
0.92271176 -0.61531847 -0.68571162 0.48434694 -0.13312036 0.57188953
-0.04983478 -1.09893481 1.15981017 0.07785162 -0.35689982 -0.13793172
-0.0859432 0.35998497 -0.87159269 0.93467795 -0.29132943 -0.24723649
0.64096142 -0.92523922 1.72201109 -0.88758178 -0.97808984 0.29402766
0.9526518 -1.41445898 1.27659955 0.80928613 -2.69915548 1.6570517
0.44466239 -0.53517067 -0.55305986 -0.56906744 2.3080095 -1.91969374
0.9355004 -0.68893124 0.98384874 -0.69804771 -0.01476748 -0.06828982
0.53112868 -0.94873461 0.81580113 0.51792077 -1.58925903 0.68281108
0.46225461 0.39894184 -0.90008877 1.18416752 -2.15054551 0.9424066
-0.14136498 1.33351003 -0.75798717 -0.1497655 -0.05779486 -0.47484991
0.94803235 -1.23221039 2.08106185 -1.95534483 1.3507371 -1.68410281
0.84112932 1.32121073 -1.90407103 0.08724138 0.86016286 -0.70329233
1.09461422 -0.43226226 -0.32475256 -0.15993829 -0.11870966 1.11335928
-0.51219893 -0.71788966 0.50782006 0.2772903 0.16786915 -1.58141178
1.26896427 0.27966826 0.10183574 -0.63971546 -0.61032516 2.37414098
-2.56170124 0.73343449 0.20452039 0.28970971 0.2477083 -1.50345518
1.4857238 0.35757928 -2.12810549 1.14136917 0.33936083 -0.60409897
0.20117627 0.78019123 0.02266318 -0.27147872 -1.3211046 1.23120002
0.34209622 -1.05168774 0.75206611 -1.90056586 2.87815662 -1.11732534
-0.37247911 0.21515434]
True
# 9-3 reference: https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.norm.html
print(np.linalg.norm(A, 'fro'))
print(np.linalg.norm(A, np.inf))
print(np.linalg.norm(A, 2))
print(np.linalg.norm(A, -2))
316.56386025354055
435.5489884442428
35.850460172919504
8.471309496868875
# 9-4 reference: 幂法求矩阵特征值
import time
Z = np.random.randn(n, n)
i = 0
x0 = np.random.randn(n)
eg_val = x0.max()
time.clock()
while True:
i += 1
x1 = Z.dot(x0/np.linalg.norm(x0, np.inf))
if (i % 100000 == 0):
print(str(i) + ': ')
print('time elapsed:', time.clock())
if i >= 1000000:
break
x0 = x1
p = abs(x0).argmax()
eg_val = x0[p]
eg_vec = x0
if np.sign(Z.dot(eg_vec)[0]) != np.sign((eg_vec*eg_val)[0]):
eg_val = -eg_val
print('eigenvalue:', eg_val)
print('eigenvector:', eg_vec)
print(np.allclose(Z.dot(eg_vec), eg_vec*eg_val)) # check
100000:
time elapsed: 2.392553391416248
200000:
time elapsed: 4.732322869466335
300000:
time elapsed: 7.509598828667907
400000:
time elapsed: 9.774808432203704
500000:
time elapsed: 12.394506673329792
600000:
time elapsed: 14.865820256301449
700000:
time elapsed: 17.533920179111597
800000:
time elapsed: 19.818027670137084
900000:
time elapsed: 22.317430430921807
1000000:
time elapsed: 25.057974497266148
eigenvalue: 159.67787537864638
eigenvector: [-133.27047541 -132.07675892 -135.42763323 -143.82592622 -145.59219875
-138.82176242 -142.07717836 -148.71893325 -133.80947043 -136.15495259
-138.40519322 -129.49815909 -135.40523796 -127.40299559 -144.09944191
-134.090092 -144.81126072 -143.21448892 -138.30883305 -138.13196031
-154.36611658 -149.45213647 -133.78913303 -137.31694006 -148.12920738
-148.08051919 -131.93034717 -139.1166509 -129.36582657 -154.11459685
-138.282479 -159.60026881 -131.37100226 -139.35434498 -142.71486057
-139.99887526 -134.51948153 -141.0598257 -141.98166005 -147.33578259
-119.39896101 -140.3912796 -144.98086469 -130.61040892 -129.55983272
-135.27741055 -129.22162844 -140.55279415 -133.96728903 -134.56884208
-144.08389743 -125.32917507 -145.26479187 -139.58469611 -133.0839744
-144.46422719 -145.72859237 -143.27092189 -139.76122198 -142.96765274
-125.92252696 -153.47358713 -129.65917363 -143.55497279 -127.83450405
-139.95426539 -135.64666443 -141.19063254 -138.31472799 -141.70528609
-136.80576913 -145.52082367 -148.81525734 -131.90587635 -148.30507163
-128.27782509 -137.15612526 -140.05196517 -131.16185209 -135.24931166
-146.7640153 -133.14396727 -137.85752579 -141.41762351 -134.53573354
-131.05627498 -136.03304894 -141.7171628 -134.90927391 -155.267524
-144.49229456 -137.43658998 -131.38200372 -159.67787538 -139.34079184
-133.58986438 -142.09415573 -130.4890389 -144.27222734 -130.9139107
-140.40107295 -133.81618319 -140.60770616 -135.77196403 -140.28016087
-127.33284859 -142.84197628 -134.17198991 -147.87267942 -134.20535298
-142.01474009 -140.42875143 -129.22655162 -142.15638879 -143.51674631
-137.6231031 -134.42239258 -138.25230686 -137.71264975 -122.33046015
-135.20184 -131.37893062 -135.0014697 -144.55558495 -137.8834151
-133.28595353 -151.07548826 -131.16362988 -154.32568021 -143.09134699
-134.9553581 -133.92043463 -145.08353437 -136.52936238 -141.77132278
-145.67337092 -128.59886631 -129.69456688 -138.54306417 -122.24447355
-142.72351261 -139.17953718 -132.17995279 -138.14181359 -155.77121847
-133.31327788 -157.13479209 -134.67695868 -140.03344515 -136.78166528
-127.29915461 -131.78077196 -115.27653478 -139.74671557 -121.08503485
-137.37741294 -142.46535739 -127.00832012 -140.17569647 -138.60102044
-146.3800391 -143.99432441 -136.43782797 -139.39783853 -140.99009259
-138.27283092 -143.0696287 -146.34751102 -147.51727354 -140.90943192
-133.90686814 -135.49977119 -152.42008952 -143.09779178 -144.0304898
-141.50504215 -137.27914146 -154.10798986 -143.11683145 -128.6967144
-148.55678493 -153.68637893 -146.78752608 -142.84912717 -139.31775588
-133.85781745 -145.42537207 -122.89724662 -141.38523673 -131.76941123
-143.11557596 -124.88362722 -135.6092054 -150.54712297 -140.56610842
-137.07495025 -139.35542647 -138.82059026 -138.92480201 -133.88103571]
True
# 9-5 reference: https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.svd.html
from scipy.linalg import svd
p = 1/3
C = np.random.binomial(1, p, (n, n))
U, s, Vh = svd(C)
print("Max SVD: ", s.max())
print("n * p:", n * p)
print("They are similar.")
Max SVD: 67.07797984662372
n * p: 66.66666666666666
They are similar.
# 9-6
def find_nearest_neighbour(A, x):
return np.argmin(abs(A-x))
A, x = np.arange(n), np.random.rand()*n
print('A =', A)
print('x =', x)
p = find_nearest_neighbour(A, x)
print('p =', p)
print('A[p] =', A[p])
A = [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
198 199]
x = 43.14580348128545
p = 43
A[p] = 43