查找数字列表的“形状”(直线/凹面/凸面,驼峰数)

vin*_*var 2 python statistics computer-science classification differentiation

这有点难以解释。我有一个整数列表。因此,例如[1, 2, 4, 5, 8, 7, 6, 4, 1]-与元素编号相对应时,-类似于凸图。如何以某种方式从列表中提取此“形状”特征?不必特别精确-只需一般形状,凸形(带有一个驼峰),凹形(带有两个驼峰),直线等即可。

我可以对每种可能的形状使用条件:例如,如果斜率在确定的指数范围内为正,在其后为负,则为斜率,其偏斜度取决于index/list_size

有一些更聪明的通用方法吗?我想这可能是分类问题-但是没有ML是否可能?

干杯。

lit*_*nce 5

numpy.diff 
Run Code Online (Sandbox Code Playgroud)

一阶差由out [n] = a [n + 1]-a [n]给出

https://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.diff.html

import numpy as np

data = [1, 2, 4, 5, 8, 7, 6, 4, 1]
data = np.array(data, dtype=float)
velocity = np.diff(data)
acceleration = np.diff(velocity)
jerk = np.diff(acceleration)
jounce = np.diff(jerk)

print data
print velocity
print acceleration
print jerk
print jounce

>>>
[ 1.  2.  4.  5.  8.  7.  6.  4.  1.]

# positive numbers = rising
[ 1.  2.  1.  3. -1. -1. -2. -3.]

# positive numbers = concave up
[ 1. -1.  2. -4.  0. -1. -1.]

# positive numbers = curling up
[-2.  3. -6.  4. -1.  0.]

# positive numbers = snapping up
[  5.  -9.  10.  -5.   1.]
Run Code Online (Sandbox Code Playgroud)

https://zh.wikipedia.org/wiki/速度

https://zh.wikipedia.org/wiki/加速

https://zh.wikipedia.org/wiki/混蛋(物理学)

https://zh.wikipedia.org/wiki/弹跳

我倾向于将一阶导数除以;速度乘以移动平均值并乘以100即可转换为%ROC;有时加速也很重要;凹度...混蛋/跳动越远,数据变得越随机/嘈杂

您还可以计算每个的平均值:

print np.mean(data)
print np.mean(velocity)
print np.mean(acceleration)
Run Code Online (Sandbox Code Playgroud)

对于此样本集,对形状进行概括:

>>>
4.22222222222     # average value
0.0               # generally sideways; no trend
-0.571428571429   # concave mostly down
Run Code Online (Sandbox Code Playgroud)

然后是平均相对标准偏差

import numpy as np
data = [1, 2, 4, 5, 8, 7, 6, 4, 1]
coef_variance = np.std(data) / np.mean(data)
print coef_variance

>>>0.566859453383
Run Code Online (Sandbox Code Playgroud)

我称之为“相当不稳定”;但不是极端的数量级;通常> 1被认为是“高度变异”

https://zh.wikipedia.org/wiki/Coefficient_of_variation

如果我们绘制:

import matplotlib.pyplot as plt
import numpy as np

data = [1, 2, 4, 5, 8, 7, 6, 4, 1]
x = range(9)

plt.plot(x,data,c='red',ms=2)

plt.show()
Run Code Online (Sandbox Code Playgroud)

我们可以看到,这是对所发现内容的总体良好描述:

在此处输入图片说明

无整体上升/下降趋势,波动较大,下凹;意思是刚超过4

您还可以polyfit:

import matplotlib.pyplot as plt
import numpy as np

data = [1, 2, 4, 5, 8, 7, 6, 4, 1]
x = range(9)
plt.plot(x,data,c='red',ms=2)
poly = np.polyfit(x,data,2)
z = []
for x in range(9):
    z.append(poly[0]*x*x + poly[1]*x + poly[2])
x = range(9)
plt.plot(x,z,c='blue',ms=2)
print poly
plt.show()
Run Code Online (Sandbox Code Playgroud)

返回:

[-0.37445887  3.195671   -0.07272727]
Run Code Online (Sandbox Code Playgroud)

换一种说法:

-0.374x^2 +  3.195x - 0.072
Run Code Online (Sandbox Code Playgroud)

哪些情节:

在此处输入图片说明

从那里您可以计算平方和,以查看模型的准确性

numpy / scipy中的平方差总和(SSD)

您可以迭代polyfit流程,每次提高

np.polyfit(x,data,degree)
Run Code Online (Sandbox Code Playgroud)

直到获得满足需求的足够低的SSD为止;它将告诉您您的数据是否更多x ^ 2ish,x ^ 3ish,x ^ 4ish等。

while ssd > your_desire:               
   poly_array = polyfit()
   ssd = sum_squares(poly_array, data)
   degree +=1
Run Code Online (Sandbox Code Playgroud)