zoukankan      html  css  js  c++  java
  • 机器学习数学笔记|偏度与峰度及其python实现

    机器学习数学笔记|偏度与峰度及其python实现

    觉得有用的话,欢迎一起讨论相互学习~

    我的微博我的github我的B站

    本博客为七月在线邹博老师机器学习数学课程学习笔记
    为七月在线打call!!
    课程传送门

    • 对于随机变量X,X的K阶原点矩为

      [E(X^{k}) ]

    • X的K阶中心矩为

      [E([X-E(X)]^{k}) ]

    • 期望实际上是随机变量X的1阶原点矩,方差实际上是随机变量X的2阶中心矩
    • 变异系数(Coefficient of Variation):标准差与均值(期望)的比值称为变异系数,记为C.V
    • 偏度Skewness(三阶)
    • 峰度Kurtosis(四阶)

    偏度与峰度

    利用matplotlib模拟偏度和峰度

    计算期望和方差

    import matplotlib.pyplot as plt
    import math
    import numpy as np
    def calc(data):
        n=len(data) # 10000个数
        niu=0.0 # niu表示平均值,即期望.
        niu2=0.0 # niu2表示平方的平均值
        niu3=0.0 # niu3表示三次方的平均值
        for a in data:
            niu += a
            niu2 += a**2
            niu3 += a**3
        niu /= n  
        niu2 /= n
        niu3 /= n
        sigma = math.sqrt(niu2 - niu*niu)
        return [niu,sigma,niu3]
    
    

    [niu=ar{X_{i}}即期望 ]

    [niu2=frac{sum_{i=1}^{n}X_{i}^{2}}{n} ]

    [niu3=frac{sum_{i=1}^{n}X_{i}^{3}}{n} ]

    • sigma表示标准差公式为

      [sigma=sqrt{E(x^{2})-E(x)^{2}} ]

      [用python语言表示即为sigma = math.sqrt(niu2 - niu*niu) ]

    • 返回值为[期望,标准差,(E(x^{3}))]
    • PS:我们知道期望E(X)的计算公式为

      [E(X)=sum_{i=1}^{n}p(i)x(i)-----(1) ]

      这里我们X一个事件p(i)表示事件出现的概率,x(i)表示事件所给予事件的权值.
    • 我们直接利用

      [E(x)=ar{X_{i}}----(2) ]

      表示期望应当明确
      1. (2)公式中(X_{i}是利用numpy中的伪随机数生成的,其均值用于表示期望)
      2. 此时(1)公式中对事件赋予的权值默认为1,即公式的本来面目为

      [E(x)=ar{(X_{i}*1)} ]

    计算偏度和峰度

    def calc_stat(data):
        [niu, sigma, niu3]=calc(data)
        n=len(data)
        niu4=0.0 # niu4计算峰度计算公式的分子
        for a in data:
            a -= niu
            niu4 += a**4
        niu4 /= n
    
        skew =(niu3 -3*niu*sigma**2-niu**3)/(sigma**3) # 偏度计算公式
        kurt=niu4/(sigma**4) # 峰度计算公式:下方为方差的平方即为标准差的四次方
        return [niu, sigma,skew,kurt]
    

    利用matplotlib模拟图像

    if __name__ == "__main__":
        data =  list(np.random.randn(10000)) # 满足高斯分布的10000个数
        data2 = list(2*np.random.randn(10000))  # 将满足好高斯分布的10000个数乘以两倍,方差变成四倍
        data3 =[x for x in data if x>-0.5] # 取data中>-0.5的值
        data4 = list(np.random.uniform(0,4,10000)) # 取0~4的均匀分布
        [niu, sigma, skew, kurt] = calc_stat(data)
        [niu_2, sigma2, skew2, kurt2] = calc_stat(data2)
        [niu_3, sigma3, skew3, kurt3] = calc_stat(data3)
        [niu_4, sigma4, skew4, kurt4] = calc_stat(data4)
        print (niu, sigma, skew, kurt)
        print (niu2, sigma2, skew2, kurt2)
        print (niu3, sigma3, skew3, kurt3)
        print (niu4, sigma4, skew4, kurt4)
        info = r'$mu=%.2f, sigma=%.2f, skew=%.2f, kurt=%.2f$' %(niu,sigma, skew, kurt) # 标注
        info2 = r'$mu=%.2f, sigma=%.2f, skew=%.2f, kurt=%.2f$' %(niu_2,sigma2, skew2, kurt2)
        info3 = r'$mu=%.2f, sigma=%.2f, skew=%.2f, kurt=%.2f$' %(niu_3,sigma3, skew3, kurt3)
        plt.text(1,0.38,info,bbox=dict(facecolor='red',alpha=0.25))
        plt.text(1,0.35,info2,bbox=dict(facecolor='green',alpha=0.25))
        plt.text(1,0.32,info3,bbox=dict(facecolor='blue',alpha=0.25))
        plt.hist(data,100,normed=True,facecolor='r',alpha=0.9)
        plt.hist(data2,100,normed=True,facecolor='g',alpha=0.8)
        plt.hist(data4,100,normed=True,facecolor='b',alpha=0.7)
        plt.grid(True)
        plt.show()
    

    • 图形表示的是利用numpy随机数生成函数生成的随机数的统计分布,利用matplotlib.pyplot.hist绘制的直方图.即是出现数字的分布统计,并且是归一化到0~1区间后的结果.
    • 即横轴表示数字,纵轴表示在1000个随机数中横轴对应的数出现的百分比.若不使用归一化横轴表示数字(normed=False),纵轴表示出现的次数.
    • 若不使用归一化--纵轴表示出现次数,

    • 关于matplotlib.pyplot.hist函数
    n, bins, patches = plt.hist(arr, bins=10, normed=0, facecolor='black', edgecolor='black',alpha=1,histtype='b')
    hist的参数非常多,但常用的就这六个,只有第一个是必须的,后面四个可选
    
    arr: 需要计算直方图的一维数组
    
    bins: 直方图的柱数,可选项,默认为10
    
    normed: 是否将得到的直方图向量归一化。默认为0
    
    facecolor: 直方图颜色
    
    edgecolor: 直方图边框颜色
    
    alpha: 透明度
    
    histtype: 直方图类型,‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’
    
    返回值 :
    
    n: 直方图向量,是否归一化由参数normed设定
    
    bins: 返回各个bin的区间范围
    
    patches: 返回每个bin里面包含的数据,是一个list
    

    参考博文

  • 相关阅读:
    JeeSite4.x 搭建并部署到服务器
    maven编译时出现There are test failures
    ecplise An incompatible version [1.2.14] of the APR based Apache Tomcat Native library is installed, while T
    maven "mvn不是内部或外部命令,也不是可运行的程序或批处理文件"
    rar自动压缩备份
    mysql 0x80004005 unable to connect to any of the specified mysql hosts
    mysql too many connections
    输出控制台信息到日志 并 通过cronolog对tomcat进行日志切分
    Node.js相关——package概念及NPM
    Node.js相关——CommonJS规范
  • 原文地址:https://www.cnblogs.com/cloud-ken/p/7832683.html
Copyright © 2011-2022 走看看