LINUX.ORG.RU

История изменений

Исправление shkolnick-kun, (текущая версия) :

Это базовый класс (не полный).

Тебе надо класс robust_lin.


import numpy as np
import matplotlib.pyplot as plt
import numpy.random as random

from sqrtkf import robust_lin as kalman

#Начальное приближение состояния
x = np.array([1.0,0,0,0]).astype('float32')

#Предполагаемая матрица ковариации состояния
P = 0.001*np.eye(4).astype('float32')

#Матрица переходов (в данном случае модель - поступательное движение)
dt = 20.0
F = np.array([[1, dt, 0,  0],
            [0,  1, 0,  0],
            [0,  0, 1, dt],
            [0,  0, 0,  1]]).astype('float32')

#bf = np.array([20.0,0,0,0]).astype('float32')

#Матрица возмущений
B = np.eye(4).astype('float32')

#Матрица ковариации возмущений
Q = 0.0000001*np.eye(4).astype('float32')

#B = np.array([[1., 0],[1, 0],[0, 1],[0, 1]])
#Q = 0.0000001*np.eye(2).astype('float32')

#Матрица наблюдения
H = np.array([[1.0, 0, 0, 0],
              [0, 0, 1, 0]]).astype('float32')

#Вектор смещения наблюдений
bh = np.array([20.0, 0.0]).astype('float32')

def _noise():
    A = 20.1
    B = 20.3
    a = np.array([random.randn()*A, random.randn()*A])
    b = random.randn()*B
    c = np.array([b, -b])
    return a + c

ri = 100.
rj = -0.5*ri

#Матрица ковариации шума наблюдений
R = np.array([[ri,rj],
            [rj, ri]])

kf = kalman(x, P, Q, R)

xs = []
ys = []

xz = []
yz = []

xo = []
yo = []


n = []
e = []
count = 1500
'''
for i in range(count):
    b = 0.0
    c = random.randn()*0.5
    a = 1*i/(1+0.00001*i*i)
    A = 100
    #z = np.array([a*np.cos(0.01*i)+random.randn()*b+c, a*np.sin(0.01*i)+random.randn()*b+c]).transpose().astype(float)
    #z = np.array([a*np.cos(0.01*i*(1+0.0001*i))+random.randn()*b+c, a*np.sin(0.01*i)+random.randn()*b+c]).transpose().astype(float)
    #z = np.array([A*np.cos(0.01*i)+random.randn()*b + c, A*np.sin(0.0101*i*(1+0.0001*i))+random.randn()*b+c]).transpose().astype(float)
    #z = np.array([A*np.cos(0.01*i)+random.randn()*b + c, A*np.sin(0.011*i)+random.randn()*b+c]).transpose().astype(float)
    
    
    p = kf.run(F, bf, B, H, bh, z)
    
    xs.append (p[0])
    ys.append (p[1])
    
    xz.append (z[0])
    yz.append (z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i)
'''

z = np.array([0, 0]).transpose().astype(float)

for i in range(count//4):
    z += np.array([1.0, 2.0])
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i)

for i in range(count//4):
    z += np.array([-1.0, 3.0])
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i+count//4)
    
for i in range(count//4):
    
    c = random.randn()*1.7
    z += np.array([-5.0+c, -3.0+c])
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i+2*count//4)
    
for i in range(count//4):
    
    c = random.randn()*0.5
    z += np.array([1+c, -2+c]).transpose().astype(float)
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i+3*count//4)


plt.plot(xs, ys)
plt.plot(xz, yz)
plt.show()

plt.plot(xo, yo)
plt.show()

plt.plot(n, e)
plt.show()

print(np.median(e))

Во, попробуй с «НЛО» поиграться поймешь, что как. Только начать лучше с bierman_lin.

Исправление shkolnick-kun, :

Это базовый класс (не полный).

Тебе надо класс robust_lin.


import numpy as np
import matplotlib.pyplot as plt
import numpy.random as random

from sqrtkf import robust_lin as kalman

#Начальное приближение состояния
x = np.array([1.0,0,0,0]).astype('float32')

#Предполагаемая матрица ковариации состояния
P = 0.001*np.eye(4).astype('float32')

#Матрица переходов (в данном случае модель - поступательное движение)
dt = 20.0
F = np.array([[1, dt, 0,  0],
            [0,  1, 0,  0],
            [0,  0, 1, dt],
            [0,  0, 0,  1]]).astype('float32')

#bf = np.array([20.0,0,0,0]).astype('float32')

#Матрица возмущений
B = np.eye(4).astype('float32')

#Матрица ковариации возмущений
Q = 0.0000001*np.eye(4).astype('float32')

#B = np.array([[1., 0],[1, 0],[0, 1],[0, 1]])
#Q = 0.0000001*np.eye(2).astype('float32')

#Матрица наблюдения
H = np.array([[1.0, 0, 0, 0],
              [0, 0, 1, 0]]).astype('float32')

#Вектор смещения наблюдений
bh = np.array([20.0, 0.0]).astype('float32')

def _noise():
    A = 20.1
    B = 20.3
    a = np.array([random.randn()*A, random.randn()*A])
    b = random.randn()*B
    c = np.array([b, -b])
    return a + c

ri = 100.
rj = -0.5*ri

#Матрица ковариации шума наблюдений
R = np.array([[ri,rj],
            [rj, ri]])

kf = kalman(x, P, Q, R)

xs = []
ys = []

xz = []
yz = []

xo = []
yo = []


n = []
e = []
count = 1500
'''
for i in range(count):
    b = 0.0
    c = random.randn()*0.5
    a = 1*i/(1+0.00001*i*i)
    A = 100
    #z = np.array([a*np.cos(0.01*i)+random.randn()*b+c, a*np.sin(0.01*i)+random.randn()*b+c]).transpose().astype(float)
    #z = np.array([a*np.cos(0.01*i*(1+0.0001*i))+random.randn()*b+c, a*np.sin(0.01*i)+random.randn()*b+c]).transpose().astype(float)
    #z = np.array([A*np.cos(0.01*i)+random.randn()*b + c, A*np.sin(0.0101*i*(1+0.0001*i))+random.randn()*b+c]).transpose().astype(float)
    #z = np.array([A*np.cos(0.01*i)+random.randn()*b + c, A*np.sin(0.011*i)+random.randn()*b+c]).transpose().astype(float)
    
    
    p = kf.run(F, bf, B, H, bh, z)
    
    xs.append (p[0])
    ys.append (p[1])
    
    xz.append (z[0])
    yz.append (z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i)
'''

z = np.array([0, 0]).transpose().astype(float)

for i in range(count//4):
    z += np.array([1.0, 2.0])
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i)

for i in range(count//4):
    z += np.array([-1.0, 3.0])
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i+count//4)
    
for i in range(count//4):
    
    c = random.randn()*1.7
    z += np.array([-5.0+c, -3.0+c])
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i+2*count//4)
    
for i in range(count//4):
    
    c = random.randn()*0.5
    z += np.array([1+c, -2+c]).transpose().astype(float)
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i+3*count//4)


plt.plot(xs, ys)
plt.plot(xz, yz)
plt.show()

plt.plot(xo, yo)
plt.show()

plt.plot(n, e)
plt.show()

print(np.median(e))

Во, попробуй с «НЛО» поиграться поймешь, что как.

Исходная версия shkolnick-kun, :

Это базовый класс (не полный).

Тебе надо класс robust_lin.


import numpy as np
import matplotlib.pyplot as plt
import numpy.random as random

from sqrtkf import robust_lin as kalman

#Начальное приближение состояния
x = np.array([1.0,0,0,0]).astype('float32')

#Предполагаемая матрица ковариации состояния
P = 0.001*np.eye(4).astype('float32')

#Матрица переходов (в данном случае модель - поступательное движение)
dt = 20.0
F = np.array([[1, dt, 0,  0],
            [0,  1, 0,  0],
            [0,  0, 1, dt],
            [0,  0, 0,  1]]).astype('float32')

#bf = np.array([20.0,0,0,0]).astype('float32')

#Матрица возмущений
B = np.eye(4).astype('float32')

#Матрица ковариации возмущений
Q = 0.0000001*np.eye(4).astype('float32')

#B = np.array([[1., 0],[1, 0],[0, 1],[0, 1]])
#Q = 0.0000001*np.eye(2).astype('float32')

#Матрица наблюдения
H = np.array([[1.0, 0, 0, 0],
              [0, 0, 1, 0]]).astype('float32')

#Вектор смещения наблюдений
bh = np.array([20.0, 0.0]).astype('float32')

def _noise():
    A = 20.1
    B = 20.3
    a = np.array([random.randn()*A, random.randn()*A])
    b = random.randn()*B
    c = np.array([b, -b])
    return a + c

ri = 100.
rj = -0.5*ri

#Матрица ковариации шума наблюдений
R = np.array([[ri,rj],
            [rj, ri]])

kf = kalman(x, P, Q, R)

xs = []
ys = []

xz = []
yz = []

xo = []
yo = []


n = []
e = []
count = 1500
'''
for i in range(count):
    b = 0.0
    c = random.randn()*0.5
    a = 1*i/(1+0.00001*i*i)
    A = 100
    #z = np.array([a*np.cos(0.01*i)+random.randn()*b+c, a*np.sin(0.01*i)+random.randn()*b+c]).transpose().astype(float)
    #z = np.array([a*np.cos(0.01*i*(1+0.0001*i))+random.randn()*b+c, a*np.sin(0.01*i)+random.randn()*b+c]).transpose().astype(float)
    #z = np.array([A*np.cos(0.01*i)+random.randn()*b + c, A*np.sin(0.0101*i*(1+0.0001*i))+random.randn()*b+c]).transpose().astype(float)
    #z = np.array([A*np.cos(0.01*i)+random.randn()*b + c, A*np.sin(0.011*i)+random.randn()*b+c]).transpose().astype(float)
    
    
    p = kf.run(F, bf, B, H, bh, z)
    
    xs.append (p[0])
    ys.append (p[1])
    
    xz.append (z[0])
    yz.append (z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i)
'''

z = np.array([0, 0]).transpose().astype(float)

for i in range(count//4):
    z += np.array([1.0, 2.0])
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i)

for i in range(count//4):
    z += np.array([-1.0, 3.0])
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i+count//4)
    
for i in range(count//4):
    
    c = random.randn()*1.7
    z += np.array([-5.0+c, -3.0+c])
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i+2*count//4)
    
for i in range(count//4):
    
    c = random.randn()*0.5
    z += np.array([1+c, -2+c]).transpose().astype(float)
    o = z + _noise()
    
    p = kf.run(F, B, H, o, bh = bh)

    xs.append(p[0])
    ys.append(p[1])
    
    xo.append(o[0])
    yo.append(o[1])
    
    xz.append(z[0])
    yz.append(z[1])
    
    e.append(np.linalg.norm(z - p))
    #e.append(z - p)
    n.append(i+3*count//4)


plt.plot(xs, ys)
plt.plot(xz, yz)
plt.show()

plt.plot(xo, yo)
plt.show()

plt.plot(n, e)
plt.show()

print(np.median(e))