LSTM水质预测模型实践

news2024/10/6 8:40:40

0 引言

随着水质自动站的普及,监测频次越来越高,自动监测越来越准确。
水质站点增多,连续的水质监测数据,给水质预测提供更多的训练基础。
长短时记忆网络(LSTM)适用于多变量、连续、自相关的数据预测。
人工神经网络模型特点为的非线性映射,是广泛应用的水质预测方法。

1.长短时记忆网络(LSTM)介绍

1.1起源

1997年,Hochreiter等提出了长短时记忆网络(LSTM),作为深度学习的一种,LSTM既考虑了多元变量间的非线性映射关系,又可以解决传统人工神经网络不能解决的时间序列长期依赖问题,应用场景包括:金融交易、交通预测、机器翻译、水质预测等。

1.2原理

长短时记忆网络(LSTM)是在循环神经网络(RNN)的基础上改进而来。
循环神经网络(RNN)作为深度学习方法的一种,其主要用途是对序列数据处理。RNN具有自连接隐层,其t时刻隐层状态依靠t-1时刻隐层状态进行更新,因此能够解决时间序列长期依赖的问题。RNN理论上可以进行非线性时间序列的有效处理,但实际对较长时间序列进行建模应用中,存在梯度消失及梯度爆炸的问题。
LSTM是RNN的一种变体,与RNN一样,LSTM隐藏层具有随时间序列的重复节点。LSTM节点相较RNN更为复杂,它将RNN中隐含层中的神经元替换为记忆体,以此实现序列信息的保留与长期记忆。
一个标准的LSTM记忆体见图1。
图1 LSTM 记忆体示意图
图 1 中,C 为 LSTM 记忆体的细胞状态,h 为节点的隐藏层状态。每个记忆体包含一到多个记忆细胞和 3 种“门”,LSTM 通过记忆细胞进行细胞状态信息存储,门结构负责细胞状态的更新与保持,3 种 “门”包括“遗忘门”“输入门”和“输出门”。“遗忘门”控制历史信息对当前细胞状态的影响。 f t f_t ft 决定了上一时刻细胞状态 C t − 1 C_{t -1} Ct1 的通过程度。
f t = σ ( w f [ h t − 1 , x i ] + b i ) (01) f_t=σ(w_f[h_{t-1},x_i]+bi)\tag{01} ft=σ(wf[ht1,xi]+bi)(01)
C t − 1 C_{t -1} Ct1为t - 1 时刻细胞状态;ht - 1为t - 1 时刻隐藏层状态; σ 为sigmoid 激活函数; wf 为输入循环权重; Xt 为当前时刻节点的输入值;bf 为偏置项。“输入门”决定了进入记忆细胞的是哪些信息,“遗忘门”与“输入门”结合可以实现细胞状态Ct 的更新。
i t = σ ( w i [ h t − 1 , x i ] + b i ) (02) i_t=σ(w_i[h_{t-1},x_i]+b_i)\tag{02} it=σ(wi[ht1,xi]+bi)(02)
C t ‘ = T a n h ( w C [ h t − 1 , x i ] + b C ) (03) C_t^‘=Tanh(w_C[h_{t-1},x_i]+b_C)\tag{03} Ct=Tanh(wC[ht1,xi]+bC)(03)
C t = f i C t − 1 + i t C t ‘ (04) C_t=f_iC_{t-1}+i_tC_t^‘\tag{04} Ct=fiCt1+itCt(04)
式中it 为输入门向量值; C’t为新信息; Ct 为t 时刻,细胞状态; bi、bC 为偏置项; wC 为输入权重。
“输出门”控制细胞状态值的输出,用Tanh 激活函数处理细胞状态后,与记忆单元状态值相乘得到输出信息。
σ t = σ ( w o [ h t − 1 , x t ] + b o ) (05) σ_t=σ(w_o[h_{t-1},x_t]+b_o)\tag{05} σt=σ(wo[ht1,xt]+bo)(05)
h t = o t × T a n h ( C t ) (06) h_t=o_t×Tanh(C_t)\tag{06} ht=ot×Tanh(Ct)(06)
式中 h t h_t ht为t 时刻隐藏层状态; w o w_o wo为输入权重; o t o_t ot为输出值; b o b_o bo为偏置项。
由上式可以看出,LSTM 节点通过门结构对细胞状态上的信息进行线性修改,从而保证在时间序列变长的情况下,依然能够保持时间相关性不会衰减。

2.算法流程及评价指标

2.1 算法流程

模型包括2个部分,分别为模型预处理与模型训练与评价。

2.1.1 数据预处理

数据预处理分为引入前处理及引入后处理。

引入前处理

引入前使用sql语句进行预处理,主要是去除0值、空值、异常值。这里异常值判断依据基于设备上下限、及经验。

select  * FROM
(SELECT
            CASE device_id
                       WHEN '87d39a3c' THEN '站点D'
                       WHEN '2ab9a08e' THEN '站点C'
                       WHEN '17b96c2b' THEN '站点B'
             WHEN 'e83005a1' THEN '站点A'
                       END AS 'device_name' ,
                       data_time AS 'data_time',
                       CASE factor_code
                       WHEN 'w01003-Avg' THEN '浊度'
                       WHEN 'w21003-Avg' THEN '氨氮'
                       WHEN 'w01010-Avg' THEN '水温'
                       WHEN 'w01014-Avg' THEN '电导率'
                       WHEN 'w01019-Avg' THEN '高指'
                       WHEN 'w01001-Avg' THEN 'PH'
                       WHEN 'w21011-Avg' THEN '总磷'
                       WHEN 'w01009-Avg' THEN '溶解氧'
                       WHEN 'w21001-Avg' THEN '总氮'
                     END AS 'fator_code',
                       value as 'value'
                      FROM iot_devices_detail
                      where device_id in ('87d39a3c','2ab9a08e','17b96c2b','e83005a1')
                      and data_time > '2021-01-01 00:00:00'
                      and factor_code in ('w21003-Avg','w21011-Avg','w01019-Avg')
                      and frequency='h4'
                      and value>0
                       AND value  is not null
                       and  flag='1'
                       group by data_time,factor_code,device_id
                       order by device_id,factor_code) d
                       WHERE
                         d.fator_code='高指' and d.value between 2 and 20
                        or  d.fator_code='总磷' and d.value between 0 and 1.5
                        or d.fator_code='氨氮' and d.value between 0 and 150
                        or d.fator_code='浊度' and d.value between 0 and 4000
                         or d.fator_code='水温' and d.value between 0 and 60
                         or d.fator_code='电导率' and d.value between 0 and 2000
                         or d.fator_code='PH' and d.value between 0 and 14
                         or d.fator_code='溶解氧' and d.value between 0 and 20
                         or d.fator_code='总氮' and d.value between 0 and 100

py引入可使用MySQL语句
其中sql为上面的代码,注意去掉换行符

def conn_sql(sql):

    conn = pymysql.connect(host="",
                   port=3306,
                   user="",
                   password="",
                   db="",
                   charset="utf8")
    sql = sql

    read_sql = pd.read_sql(sql, conn)

    return read_sql
# read_sql=conn_sql()
# 定义链接数据库 
df = conn_sql(sql)
引入后处理

py数据处理内容为空值补全,补全方法为生成连续一小时时间序列index,数据拼接,数据线性插值。

def dataprocess_en(df, s, y):
    """
    df:DataFrame时间序列数据;
    s:device_name
    y:fator_code
    """
    aidunqiao = df.loc[df["device_name"] == s, :]
    ai_cod = aidunqiao.loc[df["fator_code"] == y, :]
    ai_cod_mn = ai_cod.loc[:, ["data_time", "value"]]
    baseline = ai_cod.loc[:, ["data_time", "value"]]

    ai_cod_mn.set_index("data_time", inplace=True)
    interp_cod_mn = ai_cod_mn["value"].interpolate()
    ai_cod_mn["value_2"] = interp_cod_mn
    starttime = baseline.iloc[0, 0]
    rows = baseline.shape[0]
    endtime = baseline.iloc[rows - 1, 0]

    year_month_day = pd.date_range(starttime, endtime, freq="h").strftime(
        "%Y%m%d%h%m%s"
    )
    a_ser = pd.DataFrame({"data_time": year_month_day})
    a_ser.set_index("data_time", inplace=True)
    df = pd.concat([a_ser, ai_cod_mn], axis=0, join="outer")
    df = df.reset_index(drop=False)
    df["data_time"] = pd.to_datetime(df["data_time"])
    df1 = df.drop_duplicates(subset="data_time", keep="last", ignore_index=True)
    df2 = df1.sort_values(by="data_time", ignore_index=True)
    df2["value_2"] = df2["value"].interpolate()
    df2.drop(columns="value", inplace=True)
    df2.set_index("data_time", inplace=True)
    df2.columns = [s]

    return df2

数据输出结果为,指定站点,制定因子的连续一小时监测结果。
引入数据后根据dataprocess_en,计算并拼接为最终预测基础数据。

station = df["device_name"].unique()
factors = df["fator_code"].unique()
dfn= pd.DataFrame()
for j in range(len(factors)):
    dfn= pd.DataFrame()
    for i in range(len(station)):
        globals()['df_{}_{}'.format(i,j)] = data_process.dataprocess_en(df,station[i],factors[j])
        globals()['dm{}'.format(j)] = pd.concat([dfn, globals()['df_{}_{}'.format(i,j)]],axis=1)
        dfn=globals()['dm{}'.format(j)]

以上代码将输出dm0,dm1,dm2,不同因子的预测数据集

# 将需要预测的数据放在首列
pred_col= ['站点A']
all_cols = dm0.columns.values.tolist()
new_cols = pred_col + all_cols
new_cols = pd.Series(pred_col + all_cols).drop_duplicates()

当然也可以用比较直接的方式拼接数据集。

yx ="站点B"
fh ="站点C"
bl ="站点D"
cb = "站点A"
cod ="高指"
tp ="总磷"
nh3 ="氨氮"
df_cb_tp  =data_process.dataprocess_en(df,cb,tp)
df_yx_tp  =data_process.dataprocess_en(df,yx,tp)
df_fh_tp  =data_process.dataprocess_en(df,fh,tp)
df_bl_tp  =data_process.dataprocess_en(df,bl,tp)
df2 = pd.concat([df_cb_tp ,df_yx_tp,df_fh_tp,df_bl_tp],axis=1)
df2=df2[-3000:] # 取近3000个数据,保证运算速度和数据的更新程度
# df2=df2[::4] 可以取逐4小时值

以上数据准备结束,总磷预测数据集示例如下,第一列站点A为预测因变量。data_time为index

data_time(index)站点A站点B站点C站点D
2022-05-17 05:00:000.19550.2501250.243550.247800
2022-05-17 06:00:000.19500.2479500.243400.243100
2022-05-17 07:00:000.19450.2457750.243250.238400
2022-05-17 08:00:000.19400.2436000.243100.233700
2022-05-17 09:00:000.18850.2408500.242900.230225
2.1.2 模型搭建与训练

模型框架为
训练阶段 预测站点窗口滑动,
从结构示例图看,若样本窗口数量为30,样本列数(含预测站点)为n,则框中红点数据为预测数据,其余数据为训练因变量,通过模型建立非线性关系。
image.png
为了实现预测效果,采用滑动时间滑动技术,生成训练基础数据。
image.png

本次模型搭建采用tensorflower框架,面向对象编程。

# 导入相关包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Dropout
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.wrappers.scikit_learn import KerasRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

plt.rcParams["font.sans-serif"] = ["Simhei"]  # 解决坐标轴刻度负号乱码
plt.rcParams["axes.unicode_minus"] = False
from datetime import date, datetime, timedelta
from sklearn.model_selection import GridSearchCV

# 训练模型,使用 girdsearchCV 进行参数调整以找到基础模型。

定义本体,主要参数包括,预测数据集,预测时长,预测窗口数,预测步长
预测时间和预测窗口数最好一致,
预测数据集可为多参数,第一列为预测参数,
预测步长可以理解为逐小时,还是逐4小时,默认逐小时。

class LSTMTimePredictor:
    def __init__(self, df, shift_n=30, test_ratio=0.2, n_past=30,p_step=1 ,optimizer="adam"):
        """
        df:DataFrame时间序列数据;
        test_ratio:测试比率
        n_past:预测的窗口数;
        optimizer:优化器;
        n_features:特征数;
        feature_names:特征名称;
        shirt_n:预测时长
        """
        self.df = df
        self.test_ratio = test_ratio
        self.n_past = n_past
        self.shift_n = shift_n
        self.optimizer = optimizer
        self.n_features = self.df.shape[1]
        self.feature_names = self.df.columns
        self.p_step = p_step 

时间滑动生成新的数据集。

    def shift_date_new(self):
        """
        时间滑动
        下一段滑动函数 n 为移动参数,即为预测长度
        df4都有的数据集用于训练和测试
        df9向后预测的数据需要的未知数据集;
        """
        df1 = self.df
        n = self.shift_n
        bl_fh = df1.iloc[:, 1: self.n_features]
        cb = df1.iloc[:, 0]
        cb.to_frame
        df2 = cb.shift(periods=-n, axis=0)
        df3 = pd.concat([df2, bl_fh], join="outer", axis=1)
        df9 = df3[-n:]
        df4 = df3[:-n]
        return df4, df9

数据集划分,归一化

    def _train_test_split(self):
        """
        训练测试划分;
        """
        df = self.shift_date_new()[0]
        test_split = round(len(self.df) * self.test_ratio)  # 计算测试集中的样本数量
        df_training = df[:-test_split]
        df_testing = df[-test_split:]
        # 进行最小最大归一化
        scaler = MinMaxScaler(feature_range=(0, 1))
        df_training_scaled = scaler.fit_transform(df_training)
        df_testing_scaled = scaler.transform(df_testing)

        # 获取训练集和测试集的样本数量
        self.train_length = len(df_training_scaled)
        self.test_length = len(df_testing_scaled)

        # 获取归一化后的训练样本和测试样本
        self.scaler = scaler
        return df_training_scaled, df_testing_scaled

区分自变量,因变量

    def createXY(self, datasets):
        """
        生成用于LSTM输入的多元数据,例如时间窗口n_past=30,则一个样本的维度为(30,5)
        30代表时间窗口,5代表特征数量
        将数据分为x y
        n_past 我们在预测下一个目标值时将在过去查看的步骤数 粒度
        n_past使用30,意味着将使用过去的30个值
        dataX 代表目标预测值dataY前所有因子,包括预测因子30个数据
        若n_past越小,则预测的平滑度越低,越注重于短期预测,若n_past越大则越注重长期预测
        """
        dataX = []
        dataY = []
        for i in range(self.n_past, len(datasets)):
            dataX.append(datasets[i - self.n_past : i, 0 : datasets.shape[1]])
            dataY.append(datasets[i, 0])
        return np.array(dataX), np.array(dataY)

建立模型,并查找最优参数

def grid_search(
        self,
    ):
        """
        根据数据训练模型,并查找最优的参数
        """
        df_training_scaled = self._train_test_split()[0]
        df_testing_scaled = self._train_test_split()[1]
        X_train, y_train = self.createXY(df_training_scaled)
        X_test, y_test = self.createXY(df_testing_scaled)

        grid_model = KerasRegressor(
            build_fn=self._build_model, verbose=1, validation_data=(X_test, y_test)
        )
        parameters = {
            "batch_size": [16, 20],
            "epochs": [8, 10],
            # , "Adadelta"            "optimizer": ["adam"],
        }
        # 这里前文设置了optimizer为adam 
        grid_search = GridSearchCV(estimator=grid_model, param_grid=parameters, cv=2)
        grid_search = grid_search.fit(
            X_train, y_train, validation_data=(X_test, y_test)
        )
        self.model = grid_search.best_estimator_.model

至此模型建立。

2.1.3 模型评价与模型预测

本次采用4种方法评价模型精度,分别是MSE、MAE、R2、准确率。
测试集模型预测精度评价及绘图代码如下:


    def evaluate(self, plot=True):
        """
        制图及模型评价
        """
        df_testing_scaled = self._train_test_split()[1]
        X_test, y_test = self.createXY(df_testing_scaled)
        # 预测值
        prediction = self.model.predict(X_test)
        prediction_copy_array = np.repeat(prediction, self.n_features, axis=-1)
        pred = self.scaler.inverse_transform(
            np.reshape(prediction_copy_array, (len(prediction), self.n_features))
        )[:, 0]
        # 实际值
        original_copies_array = np.repeat(y_test, self.n_features, axis=-1)
        original = self.scaler.inverse_transform(
            np.reshape(original_copies_array, (len(y_test), self.n_features))
        )[:, 0]
        # 序号还原
        df = self.shift_date_new()[0]
        test_split = round(len(self.df) * self.test_ratio)  # 计算测试集中的样本数量
        df_training = df[:-test_split]
        df_testing = df[-test_split:]
        index1 = df_testing.index
        starttime = index1[30]
        delta = timedelta(hours=30)  # 时间序号还原
        starttime = starttime + delta
        starttime = starttime.strftime("%Y-%m-%d %H:%M:%S")
        endtime = index1[-1]
        endtime = endtime + delta
        endtime = endtime.strftime("%Y-%m-%d %H:%M:%S")
        time_nu = pd.date_range(starttime, endtime, freq="h").strftime(
            "%Y-%m-%d %H:%M:%S"
        )
        time_nu = time_nu[::self.p_step]
        original_2 = pd.DataFrame(original)
        col_2 = ["真实值"]
        original_2.columns = col_2
        original_3 = original_2.set_index(time_nu)
        pred_2 = pd.DataFrame(pred)
        col_1 = ["预测值"]
        pred_2.columns = col_1
        pred_3 = pred_2.set_index(time_nu)
        if plot:
            plt.figure(figsize=(14, 6))
            plt.plot(original_3, color="red", label="真实值")
            plt.plot(pred_3, color="blue", label="预测值")
            # plt.title(" 站点A氨氮预测")
            plt.xlabel("Time")
            plt.ylabel(" 预测值")
            plt.locator_params(axis="x", nbins=10)
            plt.xticks(range(1, len(time_nu), 48), rotation=45)  # 刻度线显示优化
            plt.legend()
            plt.show()
        mae = mean_absolute_error(original, pred)
        mse = mean_squared_error(original, pred)
        mape = np.mean(np.abs(original - pred) / original)
        r2 = r2_score(original, pred)
        acc = 1 - abs((pred - original) / original)
        acc = np.mean(acc)
        print(
            "MSE : {},MAE : {}, MAPE : {}, r2 : {}, 准确率:{}".format(
                mse, mae, mape, r2, acc
            )
        )
        return pred

数据集采用临江河站点A、站点B、站点C、站点D等4个站点,预测站点A高指、氨氮、总磷3个因子。数据范围为2022/5/19 5:00:00 至 2022/9/21 4:00:00。共3000个数据。测试集占比0.2。
测试集预测评价结果如下:MSE、MAE、R2均表现较好,总磷准确率、MAPE较差,与水质浓度波动大,关系密切,可以通过进一步优化数据清理减少数据波动。
站点A高指测试集预测对比
站点A氨氮测试集预测对比
站点A总磷测试集预测对比

因子MSEMAEMAPEr2准确率
高指0.000042730.005218740.0379920.9683790.962008
氨氮0.011037160.079462500.0164750.9598180.983525
总磷0.000810640.016722490.6980550.9475090.301945
对未来的预测

模型可以自定义模型预测时长,本次以72小时为例。运行预测评价模块

lstm2 = LSTMTimePredictor(dm2,test_ratio=0.2,n_past=72,p_step=1 )
lstm2.grid_search()
lstm2.evaluate()
lstm2.fig_predict()
    def fig_predict(self):
        """
        查看数据概览图;
        """
        df = self.predict()
        plt.figure(figsize=(14, 6))
        plt.plot(df, color="red", label="预测值")
        plt.xlabel("Time")
        plt.ylabel(" 预测值")
        plt.title("水质预测")
        plt.locator_params(axis="x", nbins=10)
        # plt.xticks(range(1,len(time_nu),48),rotation=45) # 刻度线显示优化
        plt.legend()
        plt.show()

预测结果分别为,整体呈下降趋势
总磷预测结果
高指预测结果
氨氮预测结果

3 应用场景及展望

LSTM作为成熟的神经网络模型,可以实现多因子,连续时间序列预测,可以应用在有一定连续水质检测数据的平台上,预测结果较准确。因子关联可根据实际情况选择,例如上下游关系,机理关系等。
shuju ,与RNN一样,LSTM隐藏层具有随时间序列的重复节点。LSTM节点相较RNN更
为复杂,它将RNN中隐含层中的神经元替换为记忆体,以此实现序列信息的保留与长期记忆。TM是RNN的一种变体,与RNN一样,LSTM隐藏层具有随时间序列的重复节点。LSTM节点相较RNN更为复杂,它将RNN中隐含层中的神经元替换为记忆体,以此实现序列信息的保留与长期记忆。
短的的多连续适用于时记忆网络(LSTM)应用

BY

如有帮助,请收藏点赞,如需引用转载请注明出处。
微信公众号:环境猫 er
CSDN:细节处有神明
个人博客:wallflowers (maoyu92.github.io)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1889927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Yolov10训练,转化onnx,推理

yolov10对于大目标的效果好,小目标不好 一、如果你训练过yolov5,yolov8,的话那么你可以直接用之前的环境就行 目录 一、如果你训练过yolov5,yolov8,的话那么你可以直接用之前的环境就行 二、配置好后就可以配置文件…

[Leetcode 136][Easy]-只出现一次的数字

目录 题目描述 具体思路 题目描述 原题链接 具体思路 ①首先看到数组中重复的数字,想到快慢指针,但是数组的元素是乱序的不好求。因此先对数组排序。使用了STL库的sort函数,时间复杂度O(nlogn)不符合题目要求,空间复杂度O(1)。…

华为云简介

前言 华为云是华为的云服务品牌,将华为30多年在ICT领域的技术积累和产品解决方案开放给客户,致力于提供稳定可靠、安全可信、可持续创新的云服务,赋能应用、使能数据、做智能世界的“黑土地”,推进实现“用得起、用得好、用得放心…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(一)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

C4D崩溃,出现错误的文件构造如何恢复?

C4D这款业界领先的3D建模、动画、模拟和渲染软件时,用户可能会遇到各种挑战,其中软件崩溃和错误提示往往是最令人头疼的问题之一。特别是当C4D崩溃后出现“错误的文件构造”这样的提示,不仅会中断创作流程,还可能意味着辛苦工作的…

Dubbo用法示例

1.version版本控制 比如我们现在有两个服务提供者,他们分别对这个接口的实现方式不一样,那么消费者通过代理对象到底调用哪个实现呢,这就可以通过version版本控制来实现,Reference注解的version和Service注解的version需要配对&am…

Redis分布式锁的应用场景有哪些

⼀ 、应⽤场景 在多线程并发的场景下 ,Java Synchronized/Reentrantlock 锁能够实现同⼀个JVM进程内多线程 并发的安全性 ,但⽆法保证多个JVM进程实例构成的集群环境在多线程下的安全性。在⼀些业务场景 下需要引⼊分布式锁。 1、缓存击穿 当某个热点缓…

图增强LLM + 个性化健康

图增强LLM 个性化健康 提出背景图增强LLM 子解法1(使用层次图模型) 子解法2(动态数据整合) 子解法3(LLM引导评估) 提出背景 论文:https://arxiv.org/pdf/2406.16252 健康监测系统通过持续…

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列 1.打开https://ui.perfetto.dev 导入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.点击Query(SQL),在输入框中输入以下内容,按CtrlEnter,显示查询结果4.点击Show timeline,点击…

Python特征工程 — 1.4 特征归一化方法详解

目录 1 Min-Max归一化 方法1:自定义的Min-Max归一化封装函数 方法2: scikit-learn库中的MinMaxScaler 2 Z-score归一化 方法1:自定义的Z-score归一化封装函数 方法2: scikit-learn库中的StandardScaler 3 最大值归一化 4 L…

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了,续费提醒那是提前一周准时到来,但是看到客户发来的续费价格截图,我是真的没忍住。这不就是在杀熟吗?就这配置续费竟然如此昂贵?说实话这个客户的服务器代维是…

20240703在飞凌OK3588-C开发板上刷Rockchip原厂的Buildroot20220811

20240703在飞凌OK3588-C开发板上刷Rockchip原厂的Buildroot20220811 2024/7/3 18:25 详细的刷机LOG: [BEGIN] 2024/7/3 18:18:49 rootRK3588:/# DDR Version V1.07 20220412 LPDDR4X, 2112MHz channel[0] BW16 Col10 Bk8 CS0 Row16 CS1 Row16 CS2 Die BW16 Size204…

创建线程的五种方式

一.继承Thread ,重写run class MyThread extends Thread{Overridepublic void run() {//这里的内容就是该线程要完成的工作while(true) {System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeExceptio…

类和对象(提高)

类和对象(提高) 1、定义一个类 关键字class 6 class Data1 7 { 8 //类中 默认为私有 9 private: 10 int a;//不要给类中成员 初始化 11 protected://保护 12 int b; 13 public://公共 14 int c; 15 //在类的内部 不存在权限之分 16 void showData(void)…

远程登录WINDOWS10,提示你的凭据不工作

1:想通过远程桌面登录WINDOWS10输入用户名和密码后,出现下面的提示。 2:登录WINDOWS10,在运行中输入gpedit.msc 3:本地组策略编辑器窗口中,依次展开,计算机配置 ---> 管理模版---> 系统--…

海外注册 | 欧盟医疗器械法规下免除临床试验的条件与要求

在欧盟医疗器械法规(MDR)的严格监管下,植入性医疗器械和III类医疗器械通常需要进行临床试验来证明其安全性和性能。 然而,MDR也规定了一些特定情况下免除临床试验的可能性。以下是免除临床试验的条件和要求的详细说明&#xff1a…

“穿越时空的机械奇观:记里鼓车的历史与科技探秘“

在人类文明的发展历程中,科技的创新与进步不仅仅推动了社会的进步,也为我们留下了丰富的文化遗产。记里鼓车,作为一种古老的里程计量工具,其历史地位和技术成就在科技史上具有重要的意义。本文将详细介绍记里鼓车的起源、结构原理…

视频分析、目标检测的过去和未来:目标检测从入门到精通 ------ YOLOv8 到 多模态大模型处理视觉基础任务

文章大纲 计算机视觉项目的关键步骤目标检测入门视频分析项目最佳实践数据集构建数据准备:数据集标注规范与数据规模参考标注工具标注工具:目标检测yolo 极简标注工具综合标注工具:label-studio半自动标注工具:X-AnyLabeling目标检测与多模态哪些多模态模型可以做目标检测?…

顺序表--续(C语言详细版)

2.9 在指定位置之前插入数据 // 在指定位置之前插入数据 void SLInsert(SL* ps, int pos, SLDataType x); 步骤: ① 程序开始前,我们要断言一下,确保指针是有效的,不是NULL; ② 我们还要断言一下,指定的…