import pandas as pd
import numpy as np
path='C:\\Users\\18480\\Desktop\\train.csv'
df=pd.read_csv(path,encoding='utf-8')
new_df=df[df['測項'] == 'PM2.5'] # 抽取PM2.5的行
data_df=new_df.iloc[:,3:] # 抽取PM2.5的数据
x_list=[] # 定义一个二维数组对 x 进行存储
y_list=[] # 定义一个数组对 Y 进行存储
#开始抽取数据,赋值给x和y
for i in range(240): # 240行数据,一行一行抽取
y_list.extend(list(map(int,data_df.iloc[i,9:].tolist()))) # 直接获取一行的后15个数据,作为y
for j in range(15):
temp_list=list(map(int,data_df.iloc[i,j:j+9]))
temp_list.insert(0,1) # 首位插入1,与w[0](即b)相乘
x_list.append(temp_list)
x_matrix=np.array(x_list)
y_matrix=np.array(y_list)
for i in range(3200):
print("x: ",x_list[i]," y: ",y_list[i])
print(len(y_list))
# 到这一步,数据全部取出来了
#设置训练次数,为10000次
repeat=10000
alpha=0.0001 # 根据实际情况,自己进行设置
# 最开始所有的参数全部设置为0
w=[0]*10 # 九个x的参数,b 为 w[0]
w_grade=[0]*10 # 初始梯度为0
for i in range(repeat):
# 第一步是计算LOSS
# 计算求和公式
loss = 0
for a in range(3200):
loss += (np.dot(x_matrix[a],w)-y_matrix[a])**2
loss = loss/6400
# 根据公式求梯度
for p in range(3200):
for k in range(10):
w_grade[k] += (np.dot(x_matrix[p],w)-y_matrix[p])*x_matrix[p][k]
# 根据梯度更新参数值
for h in range(10):
w_grade[h] = w_grade[h]/3200
w[h] = w[h]-alpha*w_grade[h]
# print("w_grade: ",w_grade)
print("repeat: ",i," loss: ",loss," w: ",w)
トレーニング結果:
損失: 22.135286405993234 w: [0.5414245570319668, 0.020082135796932972, -0.045910419128109156, 0.21262265164385652, -0.2062546618 5953498、-0.04444239545827025、0.4544521021948807、-0.5370753208755685、0.047595282028861256、1.0731548824366408]
合計 3600 セットのデータ。最初の 3200 はトレーニングに使用され、最後の 400 はテストに使用されます。
過去 400 グループで測定された平均損失 = 41.43916066995071
結果を視覚化する
x = [i for i in range(3200,3600)]
y_1=y_matrix[3200:3600]
y_2=[]
for g in range(3200,3600):
y_2.append(np.dot(x_matrix[g],w))
y_2=np.array(y_2)
plt.plot(x,y_1,color="blue",linestyle='-') # 真实数据为蓝色线条
plt.plot(x,y_2,color="red",linestyle='-') # 预测数据为红色线条
plt.show()
実際のデータ — 予測データ (差分)