python代码:
def CalculatePip(stpos, endpos, T):
x1, y1 = stpos
xn, yn = endpos
total_err = 0
segpos = stpos
for i in range(stpos[0]+1, endpos[0] - 1):
xi = i
yi = T[i]
dis = abs((y1 + (yn - y1) * (xi - x1)) / (xn - x1) - yi)
if dis > total_err:
total_err = dis
segpos = (xi, yi)
return segpos, total_err
PIP = []
def PLR_PIP(stpos, endpos, X, e):
segpos, total_err = CalculatePip(stpos, endpos, X)
if total_err > e:
PIP.append(segpos)
PLR_PIP(stpos, segpos, X, e)
PLR_PIP(segpos, endpos, X, e)
return PIP
python代码:
def calculate_error(st, seq_range):
x = arange(seq_range[0], seq_range[1] + 1)
y = array(st[seq_range[0]:seq_range[1] + 1])
A = ones((len(x), 2), float)
A[:, 0] = x
# 返回回归系数、残差平方和、自变量X的秩、X的奇异值
(p, residuals, ranks, s) = lstsq(A, y, rcond=None)
try:
error = residuals[0]
except IndexError:
error = 0.0
return error
def PLR_FPIP(X, e, k):
# k 是分段数
FPIP = []
stpos = (0, X[0])
endpos = (len(X) - 1, X[len(X) - 1])
Q = Queue()
Q.put(stpos)
Q.put(endpos)
while not Q.empty() and len(FPIP) < k:
stpos = Q.get()
endpos = Q.get()
segpos, total_err = CalculatePip(stpos, endpos, X)
if total_err > e:
FPIP.append(segpos)
Left_err = calculate_error(X, (stpos[0], segpos[0]))
Right_err = calculate_error(X, (segpos[0], endpos[0]))
if Left_err > Right_err:
Q.put(stpos)
Q.put(segpos)
Q.put(segpos)
Q.put(endpos)
else:
Q.put(segpos)
Q.put(endpos)
Q.put(stpos)
Q.put(segpos)
return FPIP