python正态分布

摘要:
1.生成正态分布数据,绘制概率分布图importpandassaspimportnumpyasnportmatplotlib。yplotasplt#根据平均值和标准偏差计算指定范围内的正态分布概率值defnormfun(x,mu,sigma):pdf=np.exp(-(x-mu)**2)/(2*sigma**2))/(sigma*np.sqrt(2*np.pi))returnpdf#resul

1、生成正态分布数据并绘制概率分布图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


# 根据均值、标准差,求指定范围的正态分布概率值
def normfun(x, mu, sigma):
    pdf = np.exp(-((x - mu)**2)/(2*sigma**2)) / (sigma * np.sqrt(2*np.pi))
    return pdf


# result = np.random.randint(-65, 80, size=100)  # 最小值,最大值,数量
result = np.random.normal(15, 44, 100)  # 均值为0.5,方差为1
print(result)

x = np.arange(min(result), max(result), 0.1)
# 设定 y 轴,载入刚才的正态分布函数
print(result.mean(), result.std())
y = normfun(x, result.mean(), result.std())
plt.plot(x, y)  # 这里画出理论的正态分布概率曲线

# 这里画出实际的参数概率与取值关系
plt.hist(result, bins=10, rwidth=0.8, density=True)  # bins个柱状图,宽度是rwidth(0~1),=1没有缝隙
plt.title('distribution')
plt.xlabel('temperature')
plt.ylabel('probability')
# 输出
plt.show()  # 最后图片的概率和不为1是因为正态分布是从负无穷到正无穷,这里指截取了数据最小值到最大值的分布

python正态分布第1张

根据范围生成正态分布:

result = np.random.randint(-65, 80, size=100) # 最小值,最大值,数量


根据均值、方差生成正态分布:
result = np.random.normal(15, 44, 100) # 均值为0.5,方差为1

2、判断一个序列是否符合正态分布

import numpy as np
from scipy import stats


pts = 1000
np.random.seed(28041990)
a = np.random.normal(0, 1, size=pts)  # 生成1个正态分布,均值为0,标准差为1,100个点
b = np.random.normal(2, 1, size=pts)  # 生成1个正态分布,均值为2,标准差为1, 100个点
x = np.concatenate((a, b))  # 把两个正态分布连接起来,所以理论上变成了非正态分布序列
k2, p = stats.normaltest(x)
alpha = 1e-3
print("p = {:g}".format(p))


# 原假设:x是一个正态分布
if p < alpha:  # null hypothesis: x comes from a normal distribution
    print("The null hypothesis can be rejected")  # 原假设可被拒绝,即不是正态分布
else:
    print("The null hypothesis cannot be rejected")  # 原假设不可被拒绝,即使正态分布

3、求置信区间、异常值

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import pandas as pd


# 求列表数据的异常点
def get_outer_data(data_list):
    df = pd.DataFrame(data_list, columns=['value'])
    df = df.iloc[:, 0]
    # 计算下四分位数和上四分位
    Q1 = df.quantile(q=0.25)
    Q3 = df.quantile(q=0.75)

    # 基于1.5倍的四分位差计算上下须对应的值
    low_whisker = Q1 - 1.5 * (Q3 - Q1)
    up_whisker = Q3 + 1.5 * (Q3 - Q1)

    # 寻找异常点
    kk = df[(df > up_whisker) | (df < low_whisker)]
    data1 = pd.DataFrame({'id': kk.index, '异常值': kk})
    return data1


N = 100
result = np.random.normal(0, 1, N)
# result = np.random.randint(-65, 80, size=N)  # 最小值,最大值,数量
mean, std = result.mean(), result.std(ddof=1)  # 求均值和标准差

# 计算置信区间,这里的0.9是置信水平
conf_intveral = stats.norm.interval(0.9, loc=mean, scale=std)  # 90%概率
print('置信区间:', conf_intveral)

x = np.arange(0, len(result), 1)

# 求异常值
outer = get_outer_data(result)
print(outer, type(outer))
x1 = outer.iloc[:, 0]
y1 = outer.iloc[:, 1]
plt.scatter(x1, y1, marker='x', color='r')  # 所有离散点
plt.scatter(x, result, marker='.', color='g')  # 异常点
plt.plot([0, len(result)], [conf_intveral[0], conf_intveral[0]])
plt.plot([0, len(result)], [conf_intveral[1], conf_intveral[1]])
plt.show()

python正态分布第2张

4、采样点离散图和概率图

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import pandas as pd
import time


print(time.strftime('%Y-%m-%D %H:%M:%S'))


# 根据均值、标准差,求指定范围的正态分布概率值
def _normfun(x, mu, sigma):
    pdf = np.exp(-((x - mu)**2)/(2*sigma**2)) / (sigma * np.sqrt(2*np.pi))
    return pdf


# 求列表数据的异常点
def get_outer_data(data_list):
    df = pd.DataFrame(data_list, columns=['value'])
    df = df.iloc[:, 0]
    # 计算下四分位数和上四分位
    Q1 = df.quantile(q=0.25)
    Q3 = df.quantile(q=0.75)

    # 基于1.5倍的四分位差计算上下须对应的值
    low_whisker = Q1 - 1.5 * (Q3 - Q1)
    up_whisker = Q3 + 1.5 * (Q3 - Q1)

    # 寻找异常点
    kk = df[(df > up_whisker) | (df < low_whisker)]
    data1 = pd.DataFrame({'id': kk.index, '异常值': kk})
    return data1


N = 100
result = np.random.normal(0, 1, N)
# result = np.random.randint(-65, 80, size=N)  # 最小值,最大值,数量
# result = [100]*100  # 取值全相同
# result = np.array(result)
mean, std = result.mean(), result.std(ddof=1)  # 求均值和标准差
# 计算置信区间,这里的0.9是置信水平
if std == 0:  # 如果所有值都相同即标准差为0则无法计算置信区间
    conf_intveral = [min(result)-1, max(result)+1]
else:
    conf_intveral = stats.norm.interval(0.9, loc=mean, scale=std)  # 90%概率
# print('置信区间:', conf_intveral)
# 求异常值
outer = get_outer_data(result)
# 绘制离散图
fig = plt.figure()
fig.add_subplot(2, 1, 1)
plt.subplots_adjust(hspace=0.3)
x = np.arange(0, len(result), 1)
plt.scatter(x, result, marker='.', color='g')  # 画所有离散点
plt.scatter(outer.iloc[:, 0], outer.iloc[:, 1], marker='x', color='r')  # 画异常离散点
plt.plot([0, len(result)], [conf_intveral[0], conf_intveral[0]])  # 置信区间线条
plt.plot([0, len(result)], [conf_intveral[1], conf_intveral[1]])  # 置信区间线条
plt.text(0, conf_intveral[0], '{:.2f}'.format(conf_intveral[0]))  # 置信区间数字显示
plt.text(0, conf_intveral[1], '{:.2f}'.format(conf_intveral[1]))  # 置信区间数字显示
info = 'outer count:{}'.format(len(outer.iloc[:, 0]))
plt.text(min(x), max(result)-((max(result)-min(result)) / 2), info)  # 异常点数显示
plt.xlabel('sample count')
plt.ylabel('value')
# 绘制概率图
if std != 0:  # 如果所有取值都相同
    fig.add_subplot(2, 1, 2)
    x = np.arange(min(result), max(result), 0.1)
    y = _normfun(x, result.mean(), result.std())
    plt.plot(x, y)  # 这里画出理论的正态分布概率曲线
    plt.hist(result, bins=10, rwidth=0.8, density=True)  # bins个柱状图,宽度是rwidth(0~1),=1没有缝隙
    info = 'mean:{:.2f}
std:{:.2f}
mode num:{:.2f}'.format(mean, std, np.median(result))
    plt.text(min(x), max(y) / 2, info)
    plt.xlabel('value')
    plt.ylabel('Probability')
else:
    fig.add_subplot(2, 1, 2)
    info = 'non-normal distribution!!
mean:{:.2f}
std:{:.2f}
mode num:{:.2f}'.format(mean, std, np.median(result))
    plt.text(0.5, 0.5, info)
    plt.xlabel('value')
    plt.ylabel('Probability')
plt.savefig('./distribution.jpg')
plt.show()

print(time.strftime('%Y-%m-%D %H:%M:%S'))

python正态分布第3张

免责声明:文章转载自《python正态分布》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇024. asp.net中第一次使用GridView (设置鼠标经过时更换背景色)php中处理换一换的简单实例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

偏态分布(Skewed distribution)

频数分布有正态分布和偏态分布之分。正态分布是指多数频数集中在中央位置,两端的频数分布大致对称。 偏态分布是指频数分布不对称,集中位置偏向一侧。若集中位置偏向数值小的一侧,称为正偏态分布;集中位置偏向数值大的一侧,称为负偏态分布。 如果频数分布的高峰向左偏移,长尾向右侧延伸称为正偏态分布,也称右偏态分布;同样的,如果频数分布的高峰向右偏移,长尾向左延伸则成...

pytorch和tensorflow的爱恨情仇之参数初始化

pytorch和tensorflow的爱恨情仇之基本数据类型 pytorch和tensorflow的爱恨情仇之张量   pytorch和tensorflow的爱恨情仇之定义可训练的参数 pytorch版本:1.6.0 tensorflow版本:1.15.0 关于参数初始化,主要的就是一些数学中的分布,比如正态分布、均匀分布等等。 1、pytorch (1)自...

取快递的数学问题:手机尾号的重复概率

学校门口,四位手机尾号取快递。问:设有 (n) 个包裹,则存在两个包裹号码(收件人手机尾号,假设均匀分布)相同的概率 (P(n)) 是多少? 答曰:手机尾号一共有 (10^4=10000) 个,所以 ( P(n)=frac{A_{10000}^n}{(10000)^n} ), 其中 (A_n^r) 为排列数。 求出表达式非常简单,然而计算具体值时却遇到了麻...

高斯模糊的算法(高斯卷积 高斯核)

通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果。 "模糊"的算法有很多种,其中有一种叫做"高斯模糊"(Gaussian Blur)。它将正态分布(又名"高斯分布")用于图像处理。 本文介绍"高斯模糊"的算法,你会看到这是一个非常简单易懂的算法。本质上,它是一种数据平滑技术(data smoothing),适用于多个场合,图像处理...

数学统计基础-概率论与数理统计

  排列数:    组合数:      关联规则:  1、联合概率和条件概率 联合概率:P(AB)两个概率同时发生的概率    2、关联规则算法    数据分析精选 这个发现为商家带来了大量的利润,但是如何从浩如烟海却又杂乱无章的大数据中,发现啤酒和尿布销售之间的联系呢?这又给了我们什么样的启示呢?关联规则分析 关联...

图像处理之基础---滤波器 高斯滤波

引用 keendawn 的 高斯(核)函数简介1函数的基本概念 所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数。 通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 , 可记作 k(||x-xc||), 其作用往往是局部的 , 即当x远离xc时函数取值很小。最常用的径向基函数是高斯核...