matplotlib作业

Exercise 11.1: Plotting a function

比较简单,就不说了

import matplotlib.pyplot as plt
from math import *
import numpy as np


def function(x_list):
    return [pow(sin(x-2), 2) * exp(-1 * pow(x, 2)) for x in x_list]


x = np.linspace(0, 2, 200)
y = function(x)

plt.title('f(x) = sin^2(x-2)e^(-x^2)')
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y)
plt.show()

matplotlib作业_第1张图片

Exercise 11.2: Data

关于的求解详见


http://www.sci.ccny.cuny.edu/~szlam/2013-fall-366/least_squares.pdf

虽然该pdf是对的求解。但通过观察发现该pdf是对欧几里得范数的平方求解。而本题是直接对欧几里得范数求解。它们都是正数。所以使得欧几里得范数最小的值x应该是一样的。

解题公式为其中QR为A的QR分解。

import numpy as np
import matplotlib.pyplot as plt


X = np.random.randint(0, 100, size=(20,20))
b = np.random.randint(10, size=(20, 1))
z = [list(np.random.normal(0, 1, 1)) for _ in range(20)]
y = X.dot(b) + z
Q, R = np.linalg.qr(X)
b_ = np.linalg.inv(R).dot(Q.T).dot(y)

plt.plot(b, 'o')
plt.plot(b_, 'or')
plt.legend(['b', '^b'], loc='upper center')
plt.show()
matplotlib作业_第2张图片
Exercise 11.3: Histogram and density estimation
对标准正态分布取10000个样本,将这些样本根据值分为25类。统计每一类的个数。将统计好的这25个数进行核密度估计(stats.gaussian_kde)。分别绘制25个类的柱状图和密度曲线。
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
import seaborn

z = np.random.normal(0, 1, 10000)
bars = [0 for _ in range(25)]
value_set = [[] for _ in range(25)]
for value in z:
    if value < -2:
        bars[0] += 1
        value_set[0].append(value)
        continue
    for i in range(23):
        if -2 <= value + 0.16 * i and value < -2 + 0.16 * (i + 1):
            bars[i+1] += 1
            value_set[i+1].append(value)
            break
    if value >= -2 + 0.16 * 23:
        bars[24] += 1
        value_set[24].append(value)

density = stats.gaussian_kde(bars)(bars)
bars = [bar / 10000 for bar in bars]
plt.plot([-1.95+0.16*i for i in range(25)], density * 10, color = 'red')
plt.title("10000 samples of standardized normal distribution")
plt.bar([-1.95+0.16*i for i in range(25)], bars, 0.1)
plt.xticks([-2+0.16*i for i in range(25)])
plt.xticks(rotation=45)
plt.xlim((-2, 2))
plt.show()

一种更快的方法是采用seaborn,该库对matplotlib进行了二次封装,因此有简便的函数画出直方图及其密度函数曲线(seaborn.distplot)

matplotlib作业_第3张图片




你可能感兴趣的:(matplotlib作业)