python中带移动窗口的线性回归

2024-04-25 15:30:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一个程序来确定线性回归模型在一个移动的点窗口上的斜率和截距,即从(x1,y1)到(x2,y2),然后从(x2,y2)到(x3,y3)。我已经成功地对两个numpy数组(x和y)进行了线性回归,但我不确定如何处理这个项目。我想窗口大小是一个用户输入参数。我可以使用数组子集来重塑我的两个数组,并实现在其中执行线性回归的a窗口,但我不知道如何自动执行此操作,也不知道如何将每个斜率和截距保存到一个文件中。我已经尽力了,但我是一个新程序员,不知道该去哪儿找。有人能给我指出正确的方向吗?谢谢您!在

以下是我的代码:

import matplotlib.pyplot as plt
import seaborn as sns
import scipy as sp
import numpy as np
import math as math

##import data from file
data = np.genfromtxt('CA_data.csv', delimiter=',')
print(np.shape(data))
#print(data)
##subset 2D array into 1D arrays
Tinv = data[:,0]
A_data = data[:,1]
B_data = data[:,2]
C_data = data[:,3]



a = np.empty_like([])
b = np.empty_like([])

##linear regression
###for i,j in a.range(Tinv[i:j]):
    Tnew[i] = Tinv[i:j]




a, b = np.polyfit(Tinv, A_data,1)

print("slope = ", a)
print("intercept = ", b)

# #visualize optimized slope
# a_vals = np.linspace(-6500, 0, 400)
# rss = np.empty_like(a_vals)
# for i, a in enumerate(a_vals):
#   rss[i] = np.sum((A_data - a*Tinv - b)**2)
# _ = plt.plot(a_vals, rss, '-')
# _ = plt.xlabel('slope')
# _ = plt.ylabel('residual sum of squares')
# _ = plt.show()

##Theoretical plot for optimal values
startx = Tinv[0]
endx = Tinv[-1]

#print(startx)
#print(endx)
x = np.array([startx, endx])
y = a*x + b

##plot the data
plt.plot(Tinv, A_data, marker = '.', color = 'r', linestyle = 'none')
plt.plot(x,y)       #plot theoretical data
plt.margins(0.02)
plt.axis([0.00275, 0.0035, 0.5, 3.0])
plt.xlabel("x")
plt.ylabel('y')
plt.title('title')
plt.show()


# print(Tinv)
# print(A_data)
# print(B_data)
# print(C_data)

Tags: importfordataplotasnpplt线性
2条回答

我最后得出的结论是:

data = np.genfromtxt('data.csv', delimiter=',')

w = data[:,0]
x = data[:,1]
y = data[:,2]
z = data[:,3]


lenw = int(len(w))
lenx = int(len(x))    #change the value within inner parenthesis to suit different dataset

window = int(6)      #change window size
wdata_avg = np.zeros(lenw - window + 1)
a = np.zeros(lenw-window+1)
b = np.zeros(lenx-window + 1)

for i in np.arange(len(w)):
    wdata = w[i:i + window]
    xdata = x[i:i+window]
    a[i], b[i] = np.polyfit(wdata, xdata,1)
    wdata_avg[i] = np.mean(wdata)
    if i == (lenw - window):
        break

代码中可能有一些不一致之处,因为我试图格式化它,所以它是通用的,而不是特定于我的数据。在

  1. 在函数中包装建模和打印。

  2. 然后从另一个函数调用此函数,该函数将数组子集为用户指定的范围,然后再将“清理”的数据提供给预测函数。

伪代码:

def select_window(data, start, stop): 
    clean data = data[start:stop,:]
    X = clean_data[without_y]
    y = clean_data[y]

    prediction_function(X, y)

def prediction_function(X,y):
   predict_on_X_and_y_and_plot_as_you_desire

相关问题 更多 >