重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
正态分布是高斯概率分布。高斯概率分布是反映中心极限定理原理的函数,该定理指出当随机样本足够大时,总体样本将趋向于期望值并且远离期望值的值将不太频繁地出现。高斯积分是高斯函数在整条实数线上的定积分。这三个主题,高斯函数、高斯积分和高斯概率分布是这样交织在一起的,所以我认为最好尝试一次性解决这三个主题(但是我错了,这是本篇文章的不同主题)。本篇文章我们首先将研究高斯函数的一般定义是什么,然后将看一下高斯积分,其结果对于确定正态分布的归一化常数是非常必要的。最后我们将使用收集的信息理解,推导出正态分布方程。
创新互联是一家专业提供盱眙企业网站建设,专注与成都网站制作、成都做网站、H5场景定制、小程序制作等业务。10年已为盱眙众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。
首先,让我们了解高斯函数实际上是什么。高斯函数是将指数函数 exp(x) 与凹二次函数(例如 -(ax^2+bx+c) 或 -(ax^2+bx) 或只是-ax^2组成的函数。结果是一系列呈现“钟形曲线”的形状的函数。
两个高斯函数的图。第一个高斯(绿色)的λ=1和a=1。第二个(橙色)λ=2和a=1.5。两个函数都不是标准化的。也就是说,曲线下的面积不等于1。
大多数人都熟悉这类曲线是因为它们在概率和统计中被广泛使用,尤其是作为正态分布随机变量的概率密度函数。在这些情况下,函数具有的系数和参数既可以缩放“钟形”的振幅,改变其标准差(宽度),又可以平移平均值,所有这一切都是在曲线下的面积进行归一化(缩放钟形,使曲线下的面积总是等于1)的同时进行的。结果是一个高斯函数包含了一大堆的参数来影响这些结果。
如果将其认为是均值 = μ 且标准差 = σ 的正态分布方程。将其与高斯 λ exp(-ax^2) 的一般形式进行比较,我们可以看到:
前导系数 λ 有时表示为 1/Z,其中 Z=√2πσ 2,正是这样的一个结果将我们带到了本文的主要观点之一:√2πσ 2有时被称为一个自变量的正态分布的归一化常数,而1/√2πσ2则被称为归一化常数。在这两种情况下,公式中都有 π,它是从哪里来的?它通常与圆、径向对称和/或极坐标相关联。单个变量的函数如何以 π 作为其在前导系数中的归一化参数之一呢?
可以参考我们以前的文章,里面有非常详细的描述
不定积分 ∫ exp(x^2) dx 不可能用初等函数求解。有没有任何积分方法可以用来求解不定积分?
可以计算定积分,如上所述,首先对高斯函数求平方从而在 x 和 y 中产生一个具有径向对称二维图的两个变量函数。这样能够将直角坐标系转换为极坐标,在此基础上就可以使用更熟悉的积分方法(例如置换)进行积分。然后,简单地取结果的平方根(因为我们在开始时对积分进行平方) 就得到了我们的答案,顺便说一句,结果是是√π。
方法的第一步是对积分求平方——也就是说,我们将一维转换为二维,这样就可以使用多变量微积分的技术来求解积分
可以重写为:
这两个积分用x和y表示是等价的;所以它等同于x的单个积分的平方。因为变量x和y是独立的,所以可以把它们移进或移出第二个积分符号,可以这样写:
如果你不熟悉如何解二重积分也不用担心。只需先使用内部变量进行积分得到单个积分。然后用左边的变量和外面的变量积分。但现在还不需要这么做。这里需要注意的是当我们对积分进行平方时,得到了一个二维的图形化的径向对称的高斯函数。用x和y来表示积分e的指数是- (x 2+y 2)给了我们下一步应该做什么的线索。
这里棘手的部分是,我们必须将直角坐标下的二重积分转换成极坐标下的二重积分。
为了在极坐标中对整个无限区域进行积分,我们首先对 exp(−r²) 相对于从 x=0 开始并延伸到无穷大的半径 r 进行积分。结果是一个无限薄的楔形,看起来像我们原始一维高斯曲线的一半。然后我们围绕旋转轴 Z 轴旋转楔形,并累积无限数量的这些极薄的楔形。也就是说——我们在 π 从 0 到 2π 时积分。
我们现在的二重积分看起来像这样:
我们可以用 r^2 替换指数中的 −(x 2+y 2),这要感谢毕达哥拉斯。但是我们仍然需要将我们的微分从矩形转换为极坐标。
微分的转换简单的表示如下:
在任何情况下,我们的二重积分现在看起来像这样:
添加适当的积分边界:
如果我们设u=r^2,那么du=2r,我们可以写成(对于内积分)
然后求出外积分:
所以:
我们在下一节求解标准化常数时,这个结果很重要。
现在我们有了推导正态分布函数的所有前提。下面将分两步来做:首先确定我们需要的概率密度函数。这意味着以λ为单位重新转换-a-产生的函数,无论为λ选择什么值,曲线下的面积总是1。然后用随机变量的方差σ^2来转换λ。对整个实数线上的方差进行积分 从而得到我们在前导系数 √2πσ^2 中需要归一化常数的项,也是我们在分母中需要的项指数 2σ^2。我们将使用分部积分来求解方差积分。
我们将从广义高斯函数f(x)=λ exp(−ax^2)开始,正态分布下的面积必须等于1所以我们首先设置广义高斯函数的值,对整个实数线积分等于1
这里将 -a- 替换为 a^2 稍微修改了高斯分布。为什么要这样做?因为它可以使用 换元积分 U-substitution 来解决这个积分。为什么我们可以这样做?因为 -a- 是一个任意常数,所以a^2 也只是一个任意常数,可以使用 U-substitution 求解。让 u=ax 和 du=a dx 这意味着 dx=du/a, 由于 λ 和 1/a 是常数,我们可以将它们移到积分符号之外,得到:
我们从上面关于高斯积分的讨论中知道,右边积分的值等于√π。这样就可以改成:
求解 -a- 可以这样写:
根据已经发现的λ 和 -a- 之间的关系,修改后的高斯下的面积总是等于 1 也是必须的,所以我们可以进一步修改,用 πλ^2 代替 a^2 并写:
无论 λ 的值如何,该曲线下的面积始终为 1。这是我们的概率密度函数。
在获得归一化概率分布函数之前还需要做一件事:必须将 λ 重写为随机变量方差 σ^2 的函数。这将涉及对整个实数线的方差表达式进行积分所以需要采用按分部积分来完成此操作。
如果给定一个概率密度函数 f(x) 和一个均值 μ,则方差定义为从均值平方(x - μ)^2的偏差乘以整个实数线的概率密度函数f(x)的积分:
假设μ=0,因为已经有了概率密度函数h(x),所以可以写成
用分部积分法求解这个积分有:
第一项归零是因为指数中的x^2项比前一项分子中的- x项趋近于∞的速度快得多所以我们得到
右边的被积函数是概率密度函数,已经知道当对整个实数线进行积分时它的值是1 :
求解 λ 得到:
将 λ 的 1/√2πσ^2 代入我们的修改后的公式(即我们的概率密度函数),我们得到:
剩下要做的就是将平均值 μ 放入指数的分子中,以便可以根据 μ 的值沿 x 轴平移图形:
这样就完成了方程推导
作者 :Manin Bocss
我有一个以秒为单位返回信息的函数,但我需要以小时:分钟:秒存储该信息。
有没有简单的方法可以在Python中将秒转换为这种格式?
可在如何在Python中将H:MM:SS时间字符串转换为秒的方法中找到此问题的反义词。
您可以使用datetime.timedelta函数:
1
2
3 import datetime
str(datetime.timedelta(seconds=666))
'0:11:06'
恕我直言,这是最好的方法,因为您随后可以对timedelta和任何datetime对象使用算术运算。
这可以工作多天:str(datetime.timedelta(seconds=60*60*24+1)) = 1 day, 0:00:01
str(datetime.timedelta(seconds=round(666666.55)))正确显示天;限制小数秒。
timedelta不是溢出安全的,并且不能正确执行数学运算,例如str(timedelta(hours=8) - timedelta(hours=10))结果为-1 day, 22:00:00,基于整数的解决方案正是针对需要-02:00:00的情况的。
+1。这个答案很容易修改。例如,如果要在打印时忽略某个字段,请使用以下命令:stackoverflow.com/questions/7999935/
要显示2位数小时,只需添加zfill(8)。 str(datetime.timedelta(seconds=666)).zfill(8) 00:11:06
通过使用divmod()函数,该函数仅进行一次除法以同时产生商和余数,您只需执行两个数学运算就可以非常快速地得到结果:
1
2m, s = divmod(seconds, 60)
h, m = divmod(m, 60)
然后使用字符串格式将结果转换为所需的输出:
1
2print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+
如果您更喜欢运算符而不是函数,请使用模。例如(仅分钟/秒):%d:%02dmn % (seconds 60, seconds % 60)
您可以将其扩展到几天:d, h = divmod(h, 24)。
@MarkRansom:然后到m, d = divmod(m, 31)个月。糟糕,您不能。更糟糕的是,如果leap秒进入游戏,您的代码将是错误的。长话短说:使用timedelta并不要弄乱日历,它会咬你。
@Tibo timedelta处理leap秒吗?我怀疑不是。在许多应用程序中,这种简单的数学运算绰绰有余。
@MarkRansom str(timedelta(hours=8) - timedelta(hours=10))结果是-1天,22:00:00所以... idk如果它适用于leap秒,但不适用于负数。
如何对熊猫数据框中的列执行此操作?
@Tibo:不幸的是,您不能,因为time(0, 0) + timedelta(anything)是TypeError。您可以使用datetime而不是time,然后使用.time()方法进行转换,但是如果该方法意外溢出,它将无提示地执行"错误操作"。
@Tibo的注释的至少第一部分应作为注释附加到答案。尽管我同意这是简单数学的一种很好的方法,并且可以完美地计算持续到几天的持续时间,但它会失败,即几个月。可能需要额外注意的是,不应将这种解决方案与用于处理datetime对象的任何函数的替代方法混淆。
它以小函数def s2hhmmss(s): m, s = divmod(s, 60) h, m = divmod(m, 60) return str(int(h)).zfill(2) + : + str(int(m)).zfill(2) + : + str(int(s)).zfill(2)的形式出现
对于那些讨论日期时间的人:请注意,最初的问题是不希望将小时数分解为更大的时间单位,因此,如果创建的时间单位大于小时数,则需要手动将其减少为整数小时。
为了使用格式更容易格式化:timestamp = {0:02}:{1:02}:{2:02}.format(h, m, s)
我很难说出这种简单的方法(至少我不记得语法),但是可以使用time.strftime,它提供了对格式的更多控制:
1
2
3
4
5
6
7
8from time import strftime
from time import gmtime
strftime("%H:%M:%S", gmtime(666))
'00:11:06'
strftime("%H:%M:%S", gmtime(60*60*24))
'00:00:00'
gmtime用于将秒转换为strftime()所需的特殊元组格式。
Note: Truncates after 23:59:59
好吧,答案实际上是在这里提供的-stackoverflow.com/questions/1384406/
不幸的是,此方法从1开始测量天数,因此它不能用来表示时间增量,因此这是一个等待发生的事故。例如,对于time.strftime(%d %H:%M:%S, time.gmtime(1)) = 1天,0:00:01。
使用datetime:
使用':08'格式:
1
2
3
4
5
6
7
8
9
10from datetime import timedelta
"{:08}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'
"{:08}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'
"{:08}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'
没有':08'格式:
1
2
3
4
5
6
7
8"{}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'
"{}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'
"{}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'
使用time:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17from time import gmtime
from time import strftime
# NOTE: The following resets if it goes over 23:59:59!
strftime("%H:%M:%S", gmtime(125))
# Result: '00:02:05'
strftime("%H:%M:%S", gmtime(60*60*24-1))
# Result: '23:59:59'
strftime("%H:%M:%S", gmtime(60*60*24))
# Result: '00:00:00'
strftime("%H:%M:%S", gmtime(666777))
# Result: '17:12:57'
# Wrong
如果增量少于一秒钟,它将失败:"{:08}".format(timedelta(milliseconds=66)) 0:00:00.066000
对于其他所有人:without :08:示例缺少前导0。{:08}零填充到左边的8个零。
在python 3.5.2中,我收到TypeError。我正在格式化time.time()-start变量。有见识吗? TypeError: non-empty format string passed to object.__format__
我尝试使用datetime.now()而不是time.time()来生成我的timedelta对象,并且遇到相同的错误。
@ medley56使用Python3时,如果要使用诸如08:"{:08}".format(str(datetime.timedelta(seconds=666777)))之类的格式,则需要使用str()。 检查此答案以获取更多信息。
这是我的快速技巧:
1
2
3
4from humanfriendly import format_timespan
secondsPassed = 1302
format_timespan(secondsPassed)
# '21 minutes and 42 seconds'
有关更多信息,请访问:
如果需要获取datetime.time值,则可以使用以下技巧:
1my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()
您不能将timedelta添加到time,但是可以将其添加到datetime。
UPD:同一技术的另一种变化:
1my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()
可以使用大于0的任何数字来代替1。在这里,我们使用datetime.fromordinal总是返回datetime对象且time组件为零的事实。
这就是我的方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14def sec2time(sec, n_msec=3):
''' Convert seconds to 'D days, HH:MM:SS.FFF' '''
if hasattr(sec,'__len__'):
return [sec2time(s) for s in sec]
m, s = divmod(sec, 60)
h, m = divmod(m, 60)
d, h = divmod(h, 24)
if n_msec 0:
pattern = '%%02d:%%02d:%%0%d.%df' % (n_msec+3, n_msec)
else:
pattern = r'%02d:%02d:%02d'
if d == 0:
return pattern % (h, m, s)
return ('%d days, ' + pattern) % (d, h, m, s)
一些例子:
1
2
3
4
5
6
7
8
9
10
11$ sec2time(10, 3)
Out: '00:00:10.000'
$ sec2time(1234567.8910, 0)
Out: '14 days, 06:56:07'
$ sec2time(1234567.8910, 4)
Out: '14 days, 06:56:07.8910'
$ sec2time([12, 345678.9], 3)
Out: ['00:00:12.000', '4 days, 00:01:18.900']
与上面的答案相比,这有什么好处?str(datetime.timedelta(seconds=666))
@RiazRizvi为666.0和666.1值提供一致的字符串长度(以微秒为单位)。
如果需要访问浮点数的小时,分??钟和秒,dateutil.relativedelta也很方便。 datetime.timedelta没有提供类似的接口。
1
2
3
4
5from dateutil.relativedelta import relativedelta
rt = relativedelta(seconds=5440)
print(rt.seconds)
print('{:02d}:{:02d}:{:02d}'.format(
int(rt.hours), int(rt.minutes), int(rt.seconds)))
打印
1
240.0
01:30:40
我从您那里得到了不同的输出,这让我觉得您有错字。 您可能打算使用seconds=5440而不是seconds=5540。 不过,我喜欢您的回答!
感谢您指出,@ J-L,现在已修复。
以下设置对我有用。
1
2
3
4
5
6
7
8
9
10
11
12
13def sec_to_hours(seconds):
a=str(seconds//3600)
b=str((seconds%3600)//60)
c=str((seconds%3600)%60)
d=["{} hours {} mins {} seconds".format(a, b, c)]
return d
print(sec_to_hours(10000) ['2 on
白噪声是时间序列预测中的一个重要概念。如果一个时间序列是白噪声,它是一个随机数序列,不能预测。如果预测误差不是白噪声,它暗示了预测模型仍有改进空间。
什么是白噪声时间序列?
时间序列可能是白噪声。时间序列如果变量是独立的且恒等分布的均值为0,那么它是白噪声。这意味着所有变量具有相同的方差 (sigma^2),并且每个值与该系列中的所有其他值具有零相关。
如果序列中的变量被高斯分布绘制,则该系列称为高斯白噪声。
为什么这么重要?
白噪声是时间序列分析和预测中的一个重要的概念。
重要的两个主要原因为:
1.可预测性:如果你的时间序列是白噪声,那么根据定义它是随机的。你无法对它合理的建模并进行预测。
2.模型诊断:时间序列上一系列误差的预测模型最好是白噪声。
模型诊断是时间序列预测的重要领域。
时间序列数据在潜在的因素产生的信号上被预测,它包含一些白噪声成分。
例如:
y(t)= signal(t)+ noise(t)
通过时间序列预测模型进行预测,可以对其进行收集和分析。在理想情况下,预测误差应该是白噪声。
当预测误差为白噪声时,意味着时间序列中的所有信号已全部被模型利用进行预测。剩下的就是无法建模的随机波动。
模型预测的信号不是白噪声则表明可以进一步对预测模型改进。
你的时间序列白噪音吗?
你的时间序列如果符合下面条件则不是白噪声:
你的序列均值为零吗?
方差随时间变化吗?
值与延迟值相关吗?
你可以用一些工具来检查你的时间序列是否为白噪音:
创建一个折线图。检查总体特征,如变化的平均值,方差或延迟变量之间的明显关系。
计算汇总统计。对照序列中有意义的连续块的均值和方差,检查整个序列的均值和方差(如年、月、日)。
创建一个自相关的图。检查延迟变量之间的总体相关性。
白噪声时间序列的例子
在本节中,我们将使用Python创建一个高斯白噪声序列并做一些检查。它有助于在实践中创建和评估白噪声时间序列。它将提供参考框架和示例图并且使用和比较自己的时间序列项目的统计测试,以检查它们是否为白噪声
首先,我们可以使用随机模块的gauss()函数创建一个1,000个随机高斯变量的列表。
我们将从高斯分布提取变量:平均值(mu)0.0和标准偏差(sigma)1.0。
一旦创建,为方便起见,我们可以在Pandas序列中打包这个列表。
from randomimport gaussfrom randomimport seedfrom pandasimport Seriesfrom pandas.tools.plottingimport autocorrelation_plot
# seed random number generatorseed(1)# create white noise series
series= [gauss(0.0,1.0)for iin range(1000)]series= Series(series)
接下来,我们可以计算和打印一些汇总统计数据,包含序列的平均值和标准偏差。
# summary statsprint(series.describe())
鉴于我们在绘制随机数时定义了平均值和标准偏差,所以应该不会有意外。
count 1000.000000mean -0.013222std 1.003685min -2.96121425% -0.68419250% -0.01093475% 0.703915max 2.737260
我们可以看到平均值接近0.0,标准偏差接近1.0。考虑到样本较小预测会有些误差。
如果我们有更多的数据,将序列分成两半计算和比较每一半的汇总统计可能会更有趣。我们认为每个子系列的平均值和标准差都会相似。
现在我们可以创建一些序列的线条图。
# line plot
series.plot()pyplot.show()
我们可以看到,这个序列似乎是随机的。
我们还可以创建直方图,并确认分布是高斯分布。
# histogram plot
series.hist()pyplot.show()
事实上,直方图显示了典型的钟形曲线。
最后,我们可以创建一个自相关图并检查延迟变量的所有自相关。
# autocorrelationautocorrelation_plot(series)pyplot.show()
自相关图没有显示任何显著的自相关特征。在峰值时可信度达在95%和99%,但这只是统计的偶然情况。
为了完整性,下面提供了完整的代码清单。
from randomimport gaussfrom randomimport seedfrom pandasimport Seriesfrom pandas.tools.plottingimport autocorrelation_plotfrom matplotlibimport pyplot
# seed random number generatorseed(1)# create white noise series
series= [gauss(0.0,1.0)for iin range(1000)]series= Series(series)# summary statsprint(series.describe())# line plot
series.plot()pyplot.show()# histogram plot
series.hist()pyplot.show()# autocorrelationautocorrelation_plot(series)pyplot.show()
原文:网页链接
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。
画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置。
设置画布大小
turtle.screensize(canvwidth=None, canvheight=None, bg=None),参数分别为画布的宽(单位像素), 高, 背景颜色。
如:turtle.screensize(800,600, "green")
turtle.screensize() #返回默认大小(400, 300)
turtle.setup(width=0.5, height=0.75, startx=None, starty=None),参数:width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例,(startx, starty): 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。
如:turtle.setup(width=0.6,height=0.6)
turtle.setup(width=800,height=800, startx=100, starty=100)
2.1 画笔的状态
在画布上,默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中,就是使用位置方向描述小乌龟(画笔)的状态。
2.2 画笔的属性
画笔(画笔的属性,颜色、画线的宽度等)
1) turtle.pensize():设置画笔的宽度;
2) turtle.pencolor():没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组。
3) turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。
2.3 绘图命令
操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。
(1) 画笔运动命令
(2) 画笔控制命令
(3) 全局控制命令
(4) 其他命令
3. 命令详解
3.1 turtle.circle(radius, extent=None, steps=None)
描述:以给定半径画圆
参数:
radius(半径):半径为正(负),表示圆心在画笔的左边(右边)画圆;
extent(弧度) (optional);
steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)。
举例:
circle(50) # 整圆;
circle(50,steps=3) # 三角形;
circle(120, 180) # 半圆
实例:
1、太阳花
2、五角星
3、时钟程序