版权声明:未经同意窃取和转载我的内容,如果涉及到权益问题,后果自负! https://blog.csdn.net/weixin_41605937/article/details/88956098
其中在Python中提供了函数自动计算的均值和标准差和偏执值和峰值的函数: mu, sigma, skew, kurtosis = calc_statistics(d)
#!/usr/bin/python
# -*- coding:utf-8 -*-
import numpy as np
from scipy import stats
import math
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
def calc_statistics(x):
n = x.shape[0] # 样本个数
# 手动计算
m = 0
m2 = 0
m3 = 0
m4 = 0
for t in x:
m += t
m2 += t * t
m3 += t ** 3
m4 += t ** 4
m /= n
m2 /= n
m3 /= n
m4 /= n
mu = m
sigma = np.sqrt(m2 - mu * mu)
skew = (m3 - 3 * mu * m2 + 2 * mu ** 3) / sigma ** 3
kurtosis = (m4 - 4 * mu * m3 + 6 * mu * mu * m2 - 4 * mu ** 3 * mu + mu ** 4) / sigma ** 4 - 3
print('手动计算均值、标准差、偏度、峰度:', mu, sigma, skew, kurtosis)
# 使用系统函数验证
mu = np.mean(x, axis=0)
sigma = np.std(x, axis=0)
skew = stats.skew(x)
kurtosis = stats.kurtosis(x)
return mu, sigma, skew, kurtosis
if __name__ == '__main__':
d = np.random.randn(100000)
print(d)
mu, sigma, skew, kurtosis = calc_statistics(d)
print('函数库计算均值、标准差、偏度、峰度:', mu, sigma, skew, kurtosis)
# 一维直方图
mpl.rcParams[u'font.sans-serif'] = 'SimHei'
mpl.rcParams[u'axes.unicode_minus'] = False
y1, x1, dummy = plt.hist(d, bins=50, normed=True, color='g', alpha=0.75)
t = np.arange(x1.min(), x1.max(), 0.05)
y = np.exp(-t ** 2 / 2) / math.sqrt(2 * math.pi)
plt.plot(t, y, 'r-', lw=2)
plt.title(u'高斯分布,样本个数:%d' % d.shape[0])
plt.grid(True)
plt.show()
d = np.random.randn(100000, 2)
mu, sigma, skew, kurtosis = calc_statistics(d)
print('函数库计算均值、标准差、偏度、峰度:', mu, sigma, skew, kurtosis)
# 二维图像
N = 30
density, edges = np.histogramdd(d, bins=[N, N])
print('样本总数:', np.sum(density))
density /= density.max()
x = y = np.arange(N)
t = np.meshgrid(x, y)
fig = plt.figure(facecolor='w')
ax = fig.add_subplot(111, projection='3d')
ax.scatter(t[0], t[1], density, c='r', s=15 * density, marker='o', depthshade=True)
ax.plot_surface(t[0], t[1], density, cmap=cm.Accent, rstride=2, cstride=2, alpha=0.9, lw=0.75)
ax.set_xlabel(u'X')
ax.set_ylabel(u'Y')
ax.set_zlabel(u'Z')
plt.title(u'二元高斯分布,样本个数:%d' % d.shape[0], fontsize=20)
plt.tight_layout(0.1)
plt.show()
#!/usr/bin/python # -*- coding:utf-8 -*- import numpy as np from scipy import stats import matplotlib as mpl import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm mpl.rcParams['axes.unicode_minus'] = False mpl.rcParams['font.sans-serif'] = 'SimHei' if __name__ == '__main__': x1, x2 = np.mgrid[-5:5:51j, -5:5:51j] x = np.stack((x1, x2), axis=2) plt.figure(figsize=(9, 8), facecolor='w') sigma = (np.identity(2), np.diag((3,3)), np.diag((2,5)), np.array(((2,1), (2,5)))) for i in np.arange(4): ax = plt.subplot(2, 2, i+1, projection='3d') norm = stats.multivariate_normal((0, 0), sigma[i]) y = norm.pdf(x) ax.plot_surface(x1, x2, y, cmap=cm.Accent, rstride=2, cstride=2, alpha=0.9, lw=0.3) ax.set_xlabel(u'X') ax.set_ylabel(u'Y') ax.set_zlabel(u'Z') plt.suptitle(u'二元高斯分布方差比较', fontsize=18) plt.tight_layout(1.5) plt.show()
# -*- coding:utf-8 -*- # /usr/bin/python import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt from scipy.special import gamma from scipy.special import factorial mpl.rcParams['axes.unicode_minus'] = False mpl.rcParams['font.sans-serif'] = 'SimHei' if __name__ == '__main__': N = 5 x = np.linspace(0, N, 50) y = gamma(x + 1) plt.figure(facecolor='w') plt.plot(x, y, 'r-', x, y, 'm*', lw=2) z = np.arange(0, N + 1) f = factorial(z, exact=True) # 阶乘 print(f) plt.plot(z, f, 'go', markersize=8) plt.grid(b=True) plt.xlim(-0.1, N + 0.1) plt.ylim(0.5, np.max(y) * 1.05) plt.xlabel(u'X', fontsize=15) plt.ylabel(u'Gamma(X) - 阶乘', fontsize=15) plt.title(u'阶乘和Gamma函数', fontsize=16) plt.show()
# !/usr/bin/python # -*- coding:utf-8 -*- import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt def triangle_wave(size, T): t = np.linspace(-1, 1, size, endpoint=False) # where # y = np.where(t < 0, -t, 0) # y = np.where(t >= 0, t, y) y = np.abs(t) y = np.tile(y, T) - 0.5 x = np.linspace(0, 2 * np.pi * T, size * T, endpoint=False) return x, y def sawtooth_wave(size, T): t = np.linspace(-1, 1, size) y = np.tile(t, T) x = np.linspace(0, 2 * np.pi * T, size * T, endpoint=False) return x, y def triangle_wave2(size, T): x, y = sawtooth_wave(size, T) return x, np.abs(y) def non_zero(f): f1 = np.real(f) f2 = np.imag(f) eps = 1e-4 return f1[(f1 > eps) | (f1 < -eps)], f2[(f2 > eps) | (f2 < -eps)] if __name__ == "__main__": mpl.rcParams['font.sans-serif'] = [u'simHei'] mpl.rcParams['axes.unicode_minus'] = False np.set_printoptions(suppress=True) x = np.linspace(0, 2 * np.pi, 16, endpoint=False) print('时域采样值:', x) y = np.sin(2 * x) + np.sin(3 * x + np.pi / 4) + np.sin(5 * x) # y = np.sin(x) N = len(x) print('采样点个数:', N) print('\n原始信号:', y) f = np.fft.fft(y) print('\n频域信号:', f / N) a = np.abs(f / N) print('\n频率强度:', a) iy = np.fft.ifft(f) print('\n逆傅里叶变换恢复信号:', iy) print('\n虚部:', np.imag(iy)) print('\n实部:', np.real(iy)) print('\n恢复信号与原始信号是否相同:', np.allclose(np.real(iy), y)) plt.subplot(211) plt.plot(x, y, 'go-', lw=2) plt.title(u'时域信号', fontsize=15) plt.grid(True) plt.subplot(212) w = np.arange(N) * 2 * np.pi / N print(u'频率采样值:', w) plt.stem(w, a, linefmt='r-', markerfmt='ro') plt.title(u'频域信号', fontsize=15) plt.grid(True) plt.show() # 三角/锯齿波 x, y = triangle_wave(20, 5) # x, y = sawtooth_wave(20, 5) N = len(y) f = np.fft.fft(y) # print '原始频域信号:', np.real(f), np.imag(f) print('原始频域信号:', non_zero(f)) a = np.abs(f / N) # np.real_if_close f_real = np.real(f) eps = 0.3 * f_real.max() print(eps) f_real[(f_real < eps) & (f_real > -eps)] = 0 f_imag = np.imag(f) eps = 0.3 * f_imag.max() print(eps) f_imag[(f_imag < eps) & (f_imag > -eps)] = 0 f1 = f_real + f_imag * 1j y1 = np.fft.ifft(f1) y1 = np.real(y1) # print '恢复频域信号:', np.real(f1), np.imag(f1) print('恢复频域信号:', non_zero(f1)) plt.figure(figsize=(8, 8), facecolor='w') plt.subplot(311) plt.plot(x, y, 'g-', lw=2) plt.title(u'三角波', fontsize=15) plt.grid(True) plt.subplot(312) w = np.arange(N) * 2 * np.pi / N plt.stem(w, a, linefmt='r-', markerfmt='ro') plt.title(u'频域信号', fontsize=15) plt.grid(True) plt.subplot(313) plt.plot(x, y1, 'b-', lw=2, markersize=4) plt.title(u'三角波恢复信号', fontsize=15) plt.grid(True) plt.tight_layout(1.5, rect=[0, 0.04, 1, 0.96]) plt.suptitle(u'快速傅里叶变换FFT与频域滤波', fontsize=17) plt.show()