python 生成正态分布数据,并绘图和解析


Posted in Python onDecember 21, 2020

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 生成正态分布数据,并绘图和解析

根据范围生成正态分布:

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 生成正态分布数据,并绘图和解析

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}\nstd:{:.2f}\nmode 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!!\nmean:{:.2f}\nstd:{:.2f}\nmode 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 生成正态分布数据,并绘图和解析

以上就是python 生成正态分布数据,并绘图和解析的详细内容,更多关于python 正态分布的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python求crc32值的方法
Oct 05 Python
Python是编译运行的验证方法
Jan 30 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 Python
Django框架模板介绍
Jan 15 Python
Python元组常见操作示例
Feb 19 Python
Python面向对象之继承和多态用法分析
Jun 08 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 Python
python3多线程知识点总结
Sep 26 Python
Python类super()及私有属性原理解析
Jun 15 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 Python
python statsmodel的使用
Dec 21 #Python
Python 实现集合Set的示例
Dec 21 #Python
Python 实现二叉查找树的示例代码
Dec 21 #Python
如何利用Python matplotlib绘制雷达图
Dec 21 #Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 #Python
python opencv肤色检测的实现示例
Dec 21 #Python
OpenCV+Python3.5 简易手势识别的实现
Dec 21 #Python
You might like
让PHP支持页面回退的两种方法[转]
2007/02/14 PHP
php的一个登录的类 [推荐]
2007/03/16 PHP
php显示时间常用方法小结
2015/06/05 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
修复ie8&amp;chrome下window的resize事件多次执行
2011/10/20 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
Python入门必须知道的11个知识点
2018/03/21 Python
Python中的二维数组实例(list与numpy.array)
2018/04/13 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
使用OpenCV实现仿射变换—缩放功能
2019/08/29 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
2020/06/29 Python
参观接待方案
2014/03/17 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
团组织推优材料
2014/12/29 职场文书
病危通知单
2015/04/17 职场文书
抢劫罪辩护词
2015/05/21 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
Java spring单点登录系统
2021/09/04 Java/Android
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs
vue项目proxyTable配置和部署服务器
2022/04/14 Vue.js