美文网首页机器学习与数据挖掘机器学习
解密大数据课程作业-正态分布

解密大数据课程作业-正态分布

作者: 游遍星辰99 | 来源:发表于2017-03-26 19:05 被阅读350次
    #coding:utf-8  # 设定编码方式为utf-8
    %matplotlib inline
    import pandas as pd # 导入pandas包,命名为pd
    import numpy as np # 导入numpy包,命名为np
    import matplotlib.pyplot as plt # 导入pyplot包,命名为plt
    
    %config InlineBackend.figure_format='retina'
    
    stake_data=pd.read_csv('stakes.csv') #读入csv文件,返回pandas.DataFrame对象
    
    stake_data.head(5) #查看前5行
    
    len(stake_data) #查看长度
    
    89
    
    stake_time=stake_data['time'] #获得stake_data中的time列
    
    type(stake_time) #查看stake_time的类型,是一个Series对象
    
    pandas.core.series.Series
    
    time_mean=stake_time.mean()#求stake_time的均值
    time_std=stake_time.std() #求stake_time的标准差S.D.
    
    
    #定义概率密度函数
    def normfun(x,mu,sigma):
        pdf=np.exp(-((x-mu)**2)/(2*sigma**2))/(sigma*np.sqrt(2*np.pi))
        return pdf
    
    stake_time.min() #求最大值和最小值,以确定区间
    
    146.0
    
    stake_time.max()
    
    153.19999999999999
    
    x=np.arange(145,155,0.1) #设定x轴的显示范围和步长
    y=normfun(x,time_mean,time_std) #y轴显示概率密度函数,把均值和标准差代入
    plt.plot(x,y)  #绘制正态分布曲线
    plt.hist(stake_time,bins=10,rwidth=0.9,normed=True) #绘制直方图,normed=True ,直方图的值将进行归一化处理,形成概率密度
    plt.title('stake time distribution')
    plt.xlabel('stake time')
    plt.ylabel('Probability')
    plt.show()
    
    
    
    iq_data=pd.read_csv('IQscore.csv')
    
    
    
    iq_data.head(5)
    
    iq=iq_data['IQ']
    
    mean=iq.mean()
    mean
    
    100.82857142857142
    
    std=iq.std()
    std
    
    15.015905990389498
    
    iq.max()
    
    140
    
    iq.min()
    
    69
    
    x=np.arange(65,140,1)
    y=normfun(x,mean,std)
    plt.plot(x,y)
    plt.hist(iq,bins=14,rwidth=0.9,normed=True)
    plt.title('IQ distribution')
    plt.xlabel('IQ score')
    plt.ylabel('Probability')
    plt.show()
    

    知识点 :normed=True 的含义

    官方文档说明:If True, the first element of the return tuple will be the counts normalized to form a probability density, i.e., n/(len(x)`dbin), i.e., the integral of the histogram will sum to 1.

    开始我以为normalized(归一化?)之后,直方图y轴上显示的是该数据组的概率,所以每组的概率总和应该是1,但是上面的例子明显不符合。生成随机数来试验,发现理解有误。normed=True的作用是形成概率密度,即图形在x轴上的积分为1,而不是在y轴上的值之和为1.y轴上的值是多少,取决于数据组的区间大小。因为面积=宽度*高度,所以高度=面积/宽度。下面是试验的例子:

    s=np.random.sample(10)# 生成10个[0,1.0)之间的随机数
    
    s
    
    array([ 0.90267377,  0.08100027,  0.96113437,  0.19237121,  0.55422091,
            0.020286  ,  0.389889  ,  0.43902501,  0.16690993,  0.2388711 ])
    
    plt.hist(s,bins=10,range=(0, 1), alpha=0.5,normed=True) #bins=10,每组数据宽度为0.1,面积总和为2*0.1*2+4*0.1*1+1*0.1*2=1
    plt.show()
    
    plt.hist(s,bins=10,range=(0, 1), alpha=0.5)  #默认normed=False,图形和上面一样,事实上显示的是每组的频数
    plt.show()
    
    plt.hist(s,bins=20,range=(0, 1), alpha=0.5,normed=True) #bins=20,每组宽度缩小为0.05,y轴上的对应值扩大一倍,面积总和=1,不再赘述
    plt.show()
    
    plt.hist(s,bins=20,range=(0, 1), alpha=0.5)  ##默认normed=False,不进行归一化
    plt.show()
    

    可以推测,当bins=40,y轴的最大值会变为两倍。同学们可以试试。
    那什么情况下normalized之后,y轴上会显示数据组的概率呢,自然是组区间正好等于1的时候

    s2=np.random.randint(0,10,10)  #生成[0,10)之间的10个整数
    
    s2
    
    array([8, 1, 6, 3, 2, 3, 4, 3, 1, 7])
    
    plt.hist(s2,bins=10,range=(0, 10), alpha=0.5,normed=True) #各组的y值正好是该组的概率,和等于1
    plt.show()
    
    plt.hist(s2,bins=10,range=(0, 10), alpha=0.5) #默认normed=False,y轴上是各组的频数
    plt.show()
    

    对数据集的理解

    相比之下,第二个数据集更接近正态分布,但两个都不是完全拟合,现实便是如此,不可能与模型完全一致,模型的作用在于让我们知道哪个区间的概率更大。例如赛马中,假如有对冠军完成赛程时间的预测,依据模型,可以判断148以下和152以上都是冷门事件。

    关于正态分布的理解

    从直方图到正态分布,是一个从具体到一般的归纳过程。直方图显示的是每一组数据的出现频率,当组区间不断缩小,图像会逐渐趋向于一条曲线,所谓分布,是这条曲线所满足的公式。人们发现,自然界中许多现象都近似地服从正态分布,这一模型被广泛应用于科学、工程领域。假设检验、置信区间是建立在某一分布的基础上。
    以抛硬币问题为例,假定正面朝上次数X服从正态分布,已知X的一个取值x,可以通过正态分布公式计算出对应的置信区间。换句话说,抛100次,80次朝上并不是不可能,而是概率非常小,当概率小到一定程度,我们就可以怀疑硬币是不是出了问题。

    本文为解密大数据社群作业,具体请关注:

    相关文章

      网友评论

        本文标题:解密大数据课程作业-正态分布

        本文链接:https://www.haomeiwen.com/subject/kmvkottx.html