我只想对两行中的三行进行迭代,然后在迭代函数中,对那三行进行线性回归。因此,迭代三行,进行线性回归,迭代三行,进行线性回归,依此类推。
我输入了数据输入here。我想对Year和Value列中的三行进行迭代,然后进行线性回归,然后对Year and Value列中的三行进行迭代,然后进行线性回归,依此类推。
我已经尝试过此代码,但是有错误
year=data_['Year']
value=data_['Value']
i=0
count=0
for a,b in zip(year,value):
print(a,b)
count = count+1
if count%3 == 0:
x=np.array([[a]])
y=np.array([[b]])
reg=linear_model.LinearRegression()
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size = 0.2 ,random_state=3)
reg.fit(x_train,y_train)
y4=4*reg.coef_ + reg.intercept_
plt.scatter(x,y)
plt.show()
print(reg.coef_)
print("R^2 : ",reg.score(x, y))
print("Equation : 4 *", reg.coef_, "+", reg.intercept_)
print("Y4 : ", y4)
print("====")
我希望每三行的输出产生一个斜率,系数和等式。
答案 0 :(得分:1)
如果您希望每三年进行一次简单的线性回归,请尝试以下方法:
# Hardcoded input data for clarity
#all_years = data_['Year'].values
#all_values = data_['Value'].values
all_years = np.array([1,2,3,
1,2,3,
1,2,3,
1,2,3,
1,2,3])
all_values = np.array([ 6.262008, 5.795994, 5.082662,
285.433511, 260.436601, 238.713124,
2.596145, 2.508278, 2.67997,
90.823952, 91.0962765, 93.821241,
19.677544, 18.464335, 18.035489])
w = 3 # window size
for i in range(len(all_years)//w):
years = all_years[w*i : w*(i+1)].reshape(-1,1)
values = all_values[w*i : w*(i+1)].reshape(-1,1)
#print(years, values)
reg=linear_model.LinearRegression()
reg.fit(years, values)
y=(w+1)*reg.coef_ + reg.intercept_
plt.scatter(years, values)
plt.show()
print(reg.coef_)
print("R^2 : ",reg.score(years, values))
print("Equation : (w+1) *", reg.coef_, "+", reg.intercept_)
print("Y4 : ", y)
print("====")
在这种情况下,长度将为15
,因此for循环将通过i= 1, ..., 4
。然后,我使用numpy的数组切片选择年份和值。
例如,对于i = 1,它将选择[3*(1-1) : 3*1]
= [0 : 3]
,精确给出前三行。为了确保此方法与期望列向量的线性回归很好地配合,我将数组重塑为包含.reshape(-1, 1)
的1列。
这就是您想要的训练和绘图问题。
对于易于阅读且避免手动索引编制问题的版本,您可能还需要研究more-itertools
软件包。具体来说,chunked
方法在这种情况下非常有用,可以将数据分成固定长度的块,在这种情况下为3:
from more_itertools import chunked
...
w = 3 # window size
for years, values in zip(chunked(all_years, n=w), chunked(all_values, n=w)):
years = years.reshape(-1,1)
values = values.reshape(-1,1)
#print(years, values)
...