1

설명하기가 약간 어렵습니다. 정수 목록이 있습니다. 예 : [1, 2, 4, 5, 8, 7, 6, 4, 1] - 요소 번호에 대해 플롯하면 볼록 그래프와 비슷합니다. 어떻게하면이 '모양'특성을 목록에서 추출 할 수 있습니까? 특별히 정확할 필요는 없습니다. 일반적인 모양, 볼록한 점, 하나의 혹, 오목한 w/2, 직선 등은 괜찮습니다.숫자 목록의 '모양'찾기 (직선/오목/볼록, 얼마나 많은 혹스)

가능한 모든 모양에 대해 조건부를 사용할 수 있습니다. 예를 들어 기울기가 양의 값을 가지면 음의 기울기이고 기울기는 index/list_size에 따라 다릅니다.

더 깨끗하고 일반적인 방법이 있습니까? 이것이 분류 문제 일 수 있다고 생각합니다. 그러나 ML없이 가능합니까?

건배.

+0

이것은 프로그래밍 문제보다 수학 문제와 비슷합니다. 그러나 나는 당신이 원하는 것 같아요. do는 다차원 다항식에 적합하고 모양을 결정하기 위해 파생물을 사용합니다 (2 차 미분은 오목면을 제공하고 임계점의 수는 "humps"등을 나타냄) –

+0

아마 배열을 반복하고 (정확하게 또는 그렇지 않은) 일부를 검증 할 수 있습니다 수학 원리. 예 : 모든 i에 대해 v [i + 1] + v [i-1]> = v [i]'. –

+2

거친 모양은 각 연속 용어의 차이점을 확인한 다음 그 차이점을 - 대략적으로 표시합니다 (여기에있는 키는 2 차 미분과 유사합니다.) 차이점의 첫 번째 세트조차도 기호 변경을 볼 수 있습니다 피크/골짜기가 표시됩니다. –

답변

0

모든 결과가 동일한 기호가 될 때까지 반복적으로 데이터 (즉, x[i+1] - x[i])를 반복하면 어떻습니까? 예를 들어 두 번 차이가 있고 모든 결과가 음수가 아닌 경우 볼록 함을 알 수 있습니다. 그렇지 않으면 다시 차이점을 확인하고 표지판을 확인하십시오. 예를 들어 10을 초과하는 한계를 설정할 수 있습니다.이 범위를 초과하면 시퀀스가 ​​너무 복잡하여 특성을 파악할 수 없습니다. 그렇지 않으면, 당신의 모양은 당신이 다른 횟수와 궁극의 사인을 특징으로합니다.

제 1 오더 차 밖으로 [n]에 의해 주어진 [N + 1] =된다
3
numpy.diff 

- 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.] 

https://en.wikipedia.org/wiki/Velocity

https://en.wikipedia.org/wiki/Acceleration

https://en.wikipedia.org/wiki/Jerk_(physics)

https://en.wikipedia.org/wiki/Jounce

내 경향 후 첫번째 유도체를 분할한다; 속도를 이동 평균으로 곱한 다음 100을 곱하여 % ROC로 변환합니다. 때로는 가속도 중요합니다. 움푹 들어간 곳 ...

print np.mean(data) 
print np.mean(velocity) 
print np.mean(acceleration) 

이 샘플 세트, 모양에 대한 일반화를 만들기 위해 :

추가적인 당신은 바보/더 확률을 동요/소음 데이터는 각의 평균을 계산할 수 있습니다

될 수 다음

>>> 
4.22222222222  # average value 
0.0    # generally sideways; no trend 
-0.571428571429 # concave mostly down 
평균 상대 표준 편차

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 

하는 내가 좋겠 칼 l "상당히 휘발성이있다"; 극도의 규모는 아니지만 일반적으로> 1

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

"높은 변종"으로 간주하고 우리가 플롯하면된다

enter image description here

:

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() 

우리가 볼 수는 우리가 무엇을 발견의 일반적으로 좋은 설명입니다

전체적으로 업/다운 경향 없음, 상당히 휘발성, 오목 다운; 당신은 또한 polyfit 수 있습니다 단지

4 이상 의미 :

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() 

반환 : 즉

[-0.37445887 3.195671 -0.07272727] 

:

-0.374x^2 + 3.195x - 0.072 

하는 플롯 :

enter image description here

거기에서 당신은 당신의 모델이

Sum of Square Differences (SSD) in numpy/scipy

얼마나 정확하게 볼 제곱의 합을 계산할 수 있습니다 당신은 때까지 정도마다

np.polyfit(x,data,degree) 

을 증가 polyfit 과정을 반복 할 수있다 당신은 당신의 필요를 위해 충분히 낮은 SSD를 얻습니다; 만약 당신의 데이터가 x^2ish, x^3ish, x^4ish 등일 경우 당신에게 말할 것입니다.

while ssd > your_desire:    
    poly_array = polyfit() 
    ssd = sum_squares(poly_array, data) 
    degree +=1