实时车辆轨迹预测
设备锁在实际的运行过程中,有一些信息是需要实时处理的,此时路线数据不能同一时间得到,即此时不能获得一整条路线的数据,此时如果我们需要对我们的路线数据进行轨迹修复效果就会很差,并且不能满足实时性的要求。
对于以上这种情况,可以采用LSTM模型,利用前1个点或前3个点的经纬度信息对后面的经纬度点进行预测,通过使用预测点和定位点之间的距离差作为判断定位点是否有效的方法,如果两点之间的距离超过了设定的阈值,则判断该定位点为无效的定位点或错误的定位点,然后选择预测的点作为定位点替换掉原来设备的定位点。
1.导入数据
导入一条轨迹数据,作为我们的训练集
data = pd.read_excel('D:/data/399071350587_1/123.xlsx')
导入的数据格式如上图
2.特征工程
对拿到的数据进行特征工程处理,也叫做数据预处理,在我们拿到的轨迹数据当中存在一些经纬度为(0,0)的数据点,或定位无效的点,这一类点我们就需要先经过一次筛选和处理掉,以保证后续LSTM训练的过程当中的准确性。
#将文字类型转换为数字类型
data['活动状态'] = data['设备状态'].apply(lambda x: extract_field(x, 6))
data['活动状态']=data['活动状态'].map({'静止状态':0,'运动状态':1})
data['定位方式'] = data['设备状态'].apply(lambda x: extract_field(x, 1))
data['定位方式']=data['定位方式'].map({'GPS有效定位':0,'GPS无效定位':1,'LBS':1})
data=data[['定位时间','经度','纬度','活动状态','定位方式','方向','速度']]
# print(data)
data['前活动状态'] = data['活动状态'].shift(+1)
data['前定位方式'] = data['定位方式'].shift(+1)
data['前方向'] = data['方向'].shift(+1)
data['前速度'] = data['速度'].shift(+1)
data['前经度'] = data['经度'].shift(+1)
data['前纬度'] = data['纬度'].shift(+1)
# 计算两点间距
data['距离差']=np.NaN
data=Span(data)
因为时间列是object类型,对于时间预测模型LSTM来说不能直接进行使用,所以还要对时间序列进行处理,以下是我处理的一种方式,我还进行了特征的扩充,加入了车辆加速度这一特征,丰富特征数据。
# 处理时间列
data['定位时间'] = pd.to_datetime(data['定位时间']) # 确保时间列是datetime格式
data['时间差']=data['定位时间'].diff().dt.total_seconds() # 计算时间差
data['时间差']=data['时间差'].fillna(0).astype(int)#将时间差转换为以秒为单位的int类型
data['year'] = data['定位时间'].dt.year
data['month'] = data['定位时间'].dt.month
data['day'] = data['定位时间'].dt.day
data['hour'] = data['定位时间'].dt.hour
data['minute'] = data['定位时间'].dt.minute
data['second'] = data['定位时间'].dt.second
#计算加速度
#由 V=V0+at a=(V-V0)/t
data['加速度']=(data['速度']-data['前速度'])/data['时间差']
data = data.dropna() # 删除缺失值
# # 删除原时间列
data = data.drop(columns=['定位时间'])
# data.info()
#用0滤除掉时间差为0的点
data.replace([np.inf, -np.inf], 0 , inplace=True)
# data.info()
接下来就是提取特征,对数据进行归一化处理,然后使用sklean当中的train_test_split对数据集进行划分,同时创造时间序列数据。
# # 提取特征和标签 #,'前经度', '前纬度','前活动状态','前定位方式','前方向','前速度','距离差','时间差','加速度'
features = ['year', 'month', 'day', 'hour', 'minute', 'second', '方向', '活动状态', '定位方式' ,'速度','前经度', '前纬度','前活动状态','前定位方式','前方向','前速度','距离差','时间差','加速度']
labels = ['经度','纬度']
X = data[features].values
y = data[labels].values
# 归一化特征和标签
scaler_X = MinMaxScaler()
scaler_y = MinMaxScaler()
X_scaled = scaler_X.fit_transform(X)
y_scaled = scaler_y.fit_transform(y)
# #数据标准化
# scaler_X = StandardScaler()
# scaler_X.fit(X)
# X_scaled = scaler_X.fit_transform(X)
# scaler_y = StandardScaler()
# scaler_y.fit(y)
# y_scaled = scaler_y.transform(y)
# 创建时间序列数据
def create_dataset(X, y, time_steps=1):
Xs, ys = [], []
for i in range(len(X) - time_steps):
Xs.append(X[i:i + time_steps])
ys.append(y[i + time_steps])
return np.array(Xs), np.array(ys)
time_steps=1
X_seq, y_seq = create_dataset(X_scaled, y_scaled, time_steps)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_seq, y_seq, test_size=0.2, random_state=42)
X_test.shape
国亲节后继续更新 ……