python求一条曲线的斜率,最小二乘法拟合直线斜率公式
假设有以下两个数据列表:
x=[ 1,2,3,4,5,6,7,8,9,10 ]
y=[ 1,2,3,4,5,6,8,10,12,14 ]
也就是说,很明显,对这些数据拟合一条直线是不够的,梯度在数据的某个点发生了变化。(显然,我们很容易从这个数据集中找到变化的位置,但是我处理的数据集不是很清晰,所以我们会忽略它。)我觉得导数可能有点道理,这里的重点是把它当做一个自由参数。我的意思是,‘这是这个,/-这是不确定性,这是前面的线性斜率。从这一点开始,”
请注意,如果安排比较简单,可以使用这个。谢谢大家!
我不太明白你的问题。你想从两个斜坡上找到不同的指数吗?你说的不确定性是什么意思?为什么斜率是自由参数?它由两个“连续的”点定义。
顺便说一下,Python没有任何类似数组的东西。斯塔克overflow.com/questions/1514553/hellip;
@当然有数组。
@Sumnerevans有内置的array.array和更全面的数组如numpy.ndarray后者只用于科学/数值计算领域,而前者更为少见。然而,调用list数组是一个常见的错误。
@随机化,这是一个必须导入的模块,不是list这样的语言的核心和一流部分。
@那是标准库的一部分。因为它只是位于与__builtins__不同的名称空间中,不是Python的一部分。Numpy是第三方扩展,但是在核心python语言中有明确添加的函数来帮助Numpy。例如,一个椭圆形列表:
@Sumnerevans你听过“包括电池”这个词吗?如果数组位于标准python库中,还需要什么?它是否内置于所有可能的函数和数据类型中?接下来,在Python3中,你会说reduce不再是“核心”了。
回复:有不确定性。数据集中的IRL不可能像我提供的数据那样显著变化。相反,因为是随时间变化的流量,所以合并不完全,“第10天变化加减2天”的可能性很大。
这是你的数据图表。
我们需要找到两种倾向。首先,求两点之间的斜率。使用数字。
将numpy作为np导入
x=NP.array ([ 1,2,3,4,5,6,7,8,9,10 ],dtype=np.float)()()))))).
y=NP.array ([ 1,2,3,4,5,6,8,10,12,14 ],dtype=np.float)))).
m=NP.diff(y )/np.diff(x ) (x))。
是打印(m)
#1.1.1.1.1.2.2.2.]
很明显,在第六个区间(6点到7点之间),斜率会从1变成2。然后对这个数组求导,告诉你斜率什么时候变:
Print (NP.diff) (m))
[ 0.0.0.0.1.0.0.0.]。
要搜索非零值的索引:
idx=NP。非零(NP.diff(m ) ) [0]
是打印(idx)
# 4。
取x的导数,在python中,索引从零开始,所以idx 2表示6点前后斜率不同。
我想这就是我想要的——谢谢!我觉得这个在安排上比较好处理,所以想不出怎么处理。
听到这个消息我很高兴!别忘了接受它作为回答!)
当然可以。因为我只是想知道,IRL,我用的数据没有这个例子那么完美。——那是通量测量,过几天就会变,所以答案是‘斜率变化是第10天,正负2天。’我怀疑是。你知道有一个巧妙的计算方法吗?谢谢大家!
有几个小样本数据可以修改这个答案。但是,你以为NP.diff(m)在某个时间区间是零吗?
梯度可以计算为点之间的差(一阶导数)。然后检查斜率变化的位置【二阶导数】。如果它改变,则索引位置被附加到idx。即梯度变化点的集合。
请注意,第一点没有唯一的斜率。第二个点提供了斜率,但是需要第三个点来测量斜率的变化。
idx=[]
prior _ slope=float(y[1]-y[0])/(x[1]-x[0])
forninrange(2,len ) x ) : #从第三对点开始.
slope=float(y[n]-y[n-1])/(x[n]-x[n-1]))
如果坡!=先验斜率:
idx.append .
先验斜率=斜率
索引文件
[6]
当然,这在熊猫和麻木的环境中可能更有效,但我们可以为您提供一个简单的python 2解决方案。
简单理解条件列表应该也是相当有效的,但是比较难理解。
idx=[nforninrange(2,Len ) x ] ]
if float(y[n]-y[n-1])/(x[n]-x[n-1])
!=float(y[n-1]-y[n-2])/)/(x[n-1]-x[n-2])] .
所以,我没有意识到有必要指定麻木和熊猫能做什么。你如何使用它?只是好奇。
我不确定你想要什么,但是这样你可以看到进化的过程(导数):
y=[ 1,2,3,4,5,6,8,10,12,14 ]
dy=[y[i1]-y[I]for iinrange(len(y)-1)]
迪伊
[ 1,1,1,1,1,2,2,2 ]
然后求变点(二阶导数)。
dpy=[dy[i1]-dy[I]for iinrange(len(dy)-1)]
单片机学习资料
[ 0,0,0,0,1,0,0,0 ]
数字
如果需要该点的索引:
dpy.index(1)).
四
这允许您在坡度改变之前指定最后一点的值。
change=dpy.index(1))
y[改变]
5。
在你的y=[1,2,3,4,5,6,8,10,12和14]中,变化发生在索引[4]处。索引从0开始。此时y的值为5。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。