全部实战!Numpy 和 Matpltlib 学习笔记

概念

正泰分布函数

一维正态分布函数
给定数列 X=[x1,x2,...,xn]X=[x_1, x_2, ..., x_n],对应的概率为 P=[p1,p2,...,pn]P=[p_1, p_2, ..., p_n],其中对任意 pi0p_i \geq 0p1+p2+...+pn=1p_1+p_2+...+p_n=1有以下统计内容:

standard deviation: n VS n-1

正态分布的分布数据

The empirical rule, or the 68-95-99.7 rule, tells you where your values lie:

image

average, mean, median and mode

average: let X = [x1, x2, ..., xn], average(X) = sum(X)/n
mean: a formal speaking of average in statistics.
median: the middle value of ordered X. It is the right middle value in X if len(X) is odd, or it is the average the middle two values of X if len(X) is even.
mode: the value that occurs most often in X
reference: Difference Between the Mean & the Average

总标准差与样本标准差

参考:Difference Between Population and Sample Standard Deviation

定义

初始化

随机初始化

此文档介绍了numpy的各类随机分布,内容很丰富,介绍了numpy.random生成不同分布的方式,包括常见的各类分布,如均匀分布、指数分布、正泰分布、超几何分布等。特别推荐,学习numpy的随机分布看这一篇就足够了。

zip 函数

使用zip可以将两个数列合并成一个数列,

xs, ys=[1,2,3], ['a', 'b', 'c']
for item in zip(xs, ys): #=> [(1, 'a'), (2, 'b'), (3, 'c')]
    print(item)

则输出为

(1, 'a')
(2, 'b')
(3, 'c')

以正泰分布初始化

正泰分布应用

在具体应用中,如在身高统计中,实际上也可以使用不同的身高的人数和总人数的比值来确定。即:
H=h1c1+h2c2+...+hncnc1+c2+...+cn=i=1nhicii=1nciH = \frac{h_1 * c_1 + h_2 * c_2+...+h_n *c_n}{c_1+c_2+...+c_n}=\frac{\sum_{i=1}^nh_i*c_i }{\sum_{i=1}^n c_i}其中,期望身高为 H,hih_icic_i 分别为某身高和对应的人数(其中 i=1...ni = 1 ... n)。
根据以上定义,正泰分布定义如下:若随机变量 X服从一个位置参数为 μ\mu 、尺度参数为 σ\sigma 的概率分布,且其概率密度函数为
f(x)=12πσe(xμ)22σ2f(x) = \frac{1}{\sqrt{2\pi} \sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}其中,μ\mu (读作:谬) 为数学期望,σ\sigma (读作:西格玛)为标准差,两者定义分别如下所示:

import numpy as np
import matplotlib.pyplot as plt

# 表示身高为170,标准差为3,样本数量为100K
mu, sigma, num = 170, 3, 100_000

# 生成所有的高度
hs = np.random.normal(mu, sigma, num) 

# 绘制柱状图,返回xs序列,即不同身高的统计结果
_, xs, _ = plt.hist(hs, 50) 

# 根据正泰表达式的图形绘制出正泰分布的曲线
plt.plot(xs, 1/(sigma * np.sqrt(2 * np.pi)) * np.exp(-(xs - mu)**2 / (2 * sigma**2))) 

hs = np.random.randint(1, 10, (3, 4))
print(hs)
np.random.shuffle(hs)
print(hs)

操作

算法

显示

matplotlib有个非常全的绘制示例集,包括了数百个示例,均有效果图和实现代码,强烈推荐。

基本曲线

下图为正态分布在均值相同 (μ=50\mu=50) 不同的标准差下不同的情况下的曲线。通过这三条曲线的绘制,演示了曲线的主要功能。
一些官方参考文档:

import numpy as np
import matplotlib.pyplot as plt
from numpy import random

# 待显示的曲线,元组中的内容为 sigma和曲线线形
lines = [( 6, 'o', [], 'r'), (12, 'x', [4, 2], 'g'), (18, '', [6, 2], 'b')]
for line in lines:
    mu = 50
    xs = np.arange(0, 100)
    ys = 1/(line[0] * np.sqrt(2 * np.pi)) * np.exp(-(xs - mu)**2 / (2 * line[0]**2))
    # 根据正泰表达式的图形绘制出正泰分布的曲线
    plt.plot(xs, ys, marker=line[1], dashes=line[2], color=line[3], linewidth=2, label='sigma = {}'.format(line[0])) 

#用plot函数绘制折线图,线条颜色设置为绿色
plt.title('Normal Distribution',fontsize=24)
#设置图表标题和标题字号
plt.tick_params(axis='both',which='major',labelsize=14)
#设置刻度的字号
plt.xlabel('Values',fontsize=14)
#设置x轴标签及其字号
plt.ylabel('Probility',fontsize=14)
# 设置X轴的苦海无边为0至100
plt.xlim(0, 100)
# 设置X轴的显示的内容为 [0, 10, 20, ..., 100]
plt.xticks([i * 10 for i in range(11)])
plt.legend()
plt.show()

散点图画法

强烈推荐阅读官方的文档 scatter graph by official website 不仅内容格式全面清晰,而且排版也非常友好,看了以后马上就懂了。因为官方的文档,对scatter的使用的所有参数解释的很清楚,而且排列方式自上向下,然后每个参数都有详细的说明。如果一些参数的内容过多,则使用第三方的链接进行说明。

以下示例展示了在绘制过程中常用的一些方法和属性。

import numpy as np 
import matplotlib.pyplot as plt

sigma = 2 # variance
mu = 10 # average 
num = 100000 # points

rand_data = np.random.normal(mu, sigma, num) 
#for value in rand_data:
#    print(value)
# count, bins, ignored = plt.hist(rand_data, 1000)#, normed=True)
# plt.plot(bins, 1/(sigma * np.sqrt(2*np.pi)) * np.exp()))
# plt.show()
def makedata(height_avg, height_dev, weight_avg, weight_dev, count=100):
    hs = np.random.normal(height_avg, height_dev, count) 
    ws = np.random.normal(weight_avg, weight_dev, count)
    data = []
    for i in range(len(hs)):
        data.append((hs[i], ws[i]))
    return data
m1, s1 = 170, 2.1
m2, s2 = 161, 1.5

data = makedata(170, 2.1, 65, 3, 100)

def make_data(mu, sigma, num):
    return np.random.normal(mu, sigma, num)

# make 100 nodes
count = 200
hs_m = make_data(172, 5, count) 
ws_m = make_data(75, 6, count) 
hs_w = make_data(161, 4, count) 
ws_w = make_data(60, 5, count) 

#font = FontProperties(fname='/Users/hao/Library/Fonts/msyh.ttf', size=14)  
#plt.title(u'散点图示例', FontProperties=font)
plt.scatter(hs_m, ws_m, c='blue', marker='x')#,s=area)#,c=colors,alpha=0.5)
plt.scatter(hs_w, ws_w, c='red', marker='.')#,s=area)#,c=colors,alpha=0.5)
plt.show()

#for p in zip(hs_m, ws_m):
#    print(p)
#for data in makedata(170, 2.1, 65, 3, 100):
#    print("height={:.2f}cm, weight={:.2f}kg.".format(data[0], data[1]))
# plt.scatter()
# plt.scatter(X[:,0], X[:, 1], c = y_kmeans, s=0, cmap='viridis')

# plt.scatter(X[:,0], X[:, 1], c = y_kmeans, s=0, cmap='viridis')

''' 
np.random.seed(1)
x=np.random.rand(10)
y=np.random.rand(10)
 
colors=np.random.rand(10)
area=(30*np.random.rand(10))**2
'''

其他