【机器学习(十)】时间序列案例之月销量预测分析—Holt-Winters算法—Sentosa_DSML社区版

news2024/9/28 15:19:12

文章目录

  • 一、Holt-Winters算法原理
    • (一) 加法模型
    • (二) 乘法模型
    • (三) 阻尼趋势
  • 二、Holt Winters算法优缺点
    • 优点
    • 缺点
  • 三、Python代码和Sentosa_DSML社区版算法实现对比
    • (一) 数据读入和统计分析
    • (二) 数据预处理
    • (三) 模型训练和模型评估
    • (四) 模型可视化
  • 四、总结

一、Holt-Winters算法原理

什么是Holt-Winters预测算法?
  Holt-Winters算法是一种时间序列预测方法。时间序列预测方法用于提取和分析数据和统计数据并表征结果,以便根据历史数据更准确地预测未来。Holt-Winters 预测算法允许用户平滑时间序列并使用该数据预测感兴趣的领域。指数平滑法会根据历史数据分配指数递减的权重和值,以降低较旧数据的权重值。换句话说,在预测中,较新的历史数据比较旧的结果具有更大的权重。
  Holt-Winters中使用的指数平滑方法有三种:
  单指数平滑——适用于预测没有趋势或季节性模式的数据,其中数据水平可能随时间而变化。
  双重指数平滑法——用于预测存在趋势的数据。
  三重指数平滑法——用于预测具有趋势和/或季节性的数据。
  Holt-Winters包括预测方程和三个平滑方程,分别用于处理水平 ℓ t , \ell_{t}, t, 趋势 b t b_{t} bt 和季节性成分 s t s t st ,对应的平滑参数分别是 α ,   β ∗ \alpha, \ \beta^{*} α, β γ \gamma γ 。通常用 m m m 表示季节性的周期,比如季度数据 m = 4 m=4 m=4 ,月度数据 m = 12 m=1 2 m=12 ,
  Holt-Winters方法有两种变体,主要区别在于季节性成分的处理方式:
  1. 加法模型:当季节性变化较为稳定时使用加法模型。
  2. .乘法模型:当季节性变化与数据水平成比例变化时,适用乘法模型。

(一) 加法模型

  在加法模型中,季节性成分用绝对值来表示,并在水平方程中通过减去季节性成分来对数据进行季节性调整。每年内,季节性成分的和大约为零。加法模型的分量形式为:
y ^ t + h ∣ t = ℓ t + h b t + s t + h − m ( k + 1 ) \hat{y}_{t+h | t}=\ell_{t}+h b_{t}+s_{t+h-m ( k+1 )} y^t+ht=t+hbt+st+hm(k+1)
  包含三个平滑方程,其中,水平方程是一个加权平均,包含季节性调整后的观察值 ( y t − s t − m ) ( y_{t}-s_{t-m} ) (ytstm) 和非季节性预测值 ( ℓ t − 1 + b t − 1 ) ( \ell_{t-1}+b_{t-1} ) (t1+bt1)
ℓ t = α ( y t − s t − m ) + ( 1 − α ) ( ℓ t − 1 + b t − 1 ) \ell_{t}=\alpha( y_{t}-s_{t-m} )+( 1-\alpha) ( \ell_{t-1}+b_{t-1} ) t=α(ytstm)+(1α)(t1+bt1)
  趋势方程与Holt的线性方法相同。
b t = β ∗ ( ℓ t − ℓ t − 1 ) + ( 1 − β ∗ ) b t − 1 b_{t}=\beta^{*} ( \ell_{t}-\ell_{t-1} )+( 1-\beta^{*} ) b_{t-1} bt=β(tt1)+(1β)bt1
  季节性方程通过当前的季节性指数 ( y t − ℓ t − 1 − b t − 1 ) ( y_{t}-\ell_{t-1}-b_{t-1} ) (ytt1bt1) 和上一年同一季节的季节性指数 s t − m s_{t-m} stm 来平滑季节性成分。
s t = γ ( y t − ℓ t − 1 − b t − 1 ) + ( 1 − γ ) s t − m s_{t}=\gamma( y_{t}-\ell_{t-1}-b_{t-1} )+( 1-\gamma) s_{t-m} st=γ(ytt1bt1)+(1γ)stm

(二) 乘法模型

  在乘法模型中,季节性成分以相对值(百分比)表示,并通过将时间序列除以季节性成分来进行季节性调整。每年内,季节性成分的和约为 m ∘ m_{\circ} m ,乘法模型的分量形式为:
y ^ t + h ∣ t = ( ℓ t + h b t ) s t + h − m ( k + 1 ) \hat{y}_{t+h | t}=( \ell_{t}+h b_{t} ) s_{t+h-m ( k+1 )} y^t+ht=(t+hbt)st+hm(k+1)
ℓ t = α y t s t − m + ( 1 − α ) ( ℓ t − 1 + b t − 1 ) \ell_{t}=\alpha{\frac{y_{t}} {s_{t-m}}}+( 1-\alpha) ( \ell_{t-1}+b_{t-1} ) t=αstmyt+(1α)(t1+bt1)
b t = β ∗ ( ℓ t − ℓ t − 1 ) + ( 1 − β ∗ ) b t − 1 b_{t}=\beta^{*} ( \ell_{t}-\ell_{t-1} )+( 1-\beta^{*} ) b_{t-1} bt=β(tt1)+(1β)bt1
s t = γ y t ( ℓ t − 1 + b t − 1 ) + ( 1 − γ ) s t − m s_{t}=\gamma{\frac{y_{t}} {( \ell_{t-1}+b_{t-1} )}}+( 1-\gamma) s_{t-m} st=γ(t1+bt1)yt+(1γ)stm

(三) 阻尼趋势

  Holt-Winters 可以在加法和乘法季节性模型中引入阻尼(Damping)趋势。阻尼趋势能够使模型在预测未来趋势时更加稳健,避免趋势无限延伸,适用于那些趋势可能逐渐趋于稳定的时间序列数据,该方法结合了季节性和趋势的平滑,并通过阻尼因子 𝜙(0<𝜙<1) 控制趋势的持续性,将 𝜙 引入到趋势分量中,使得未来的趋势贡献逐渐减小。这样,随着预测期的增加,趋势的影响力会逐渐减弱,从而避免过度延伸。
  结合了阻尼趋势的乘法季节性的预测方程为:
y ^ t + h ∣ t = [ ℓ t + ( ϕ + ϕ 2 + ⋯ + ϕ h ) b t ] s t + h − m ( k + 1 ) \hat{y}_{t+h | t}=\left[ \ell_{t}+( \phi+\phi^{2}+\cdots+\phi^{h} ) b_{t} \right] s_{t+h-m ( k+1 )} y^t+ht=[t+(ϕ+ϕ2++ϕh)bt]st+hm(k+1)
ℓ t = α ( y t s t − m ) + ( 1 − α ) ( ℓ t − 1 + ϕ b t − 1 ) \ell_{t}=\alpha\left( \frac{y_{t}} {s_{t-m}} \right)+\left( 1-\alpha\right) \left( \ell_{t-1}+\phi b_{t-1} \right) t=α(stmyt)+(1α)(t1+ϕbt1)
b t = β ∗ ( ℓ t − ℓ t − 1 ) + ( 1 − β ∗ ) ϕ b t − 1 b_{t}=\beta^{*} \left( \ell_{t}-\ell_{t-1} \right)+( 1-\beta^{*} ) \phi b_{t-1} bt=β(tt1)+(1β)ϕbt1
s t = γ ( y t ℓ t − 1 + ϕ b t − 1 ) + ( 1 − γ ) s t − m s_{t}=\gamma\left( {\frac{y_{t}} {\ell_{t-1}+\phi b_{t-1}}} \right)+( 1-\gamma) s_{t-m} st=γ(t1+ϕbt1yt)+(1γ)stm

二、Holt Winters算法优缺点

优点

  1、Holt-Winters 方法能够有效捕捉和建模时间序列中的季节性变化,适用于具有周期性波动的数据。
  2、通过平滑参数的设置,Holt-Winters 方法能够动态调整对趋势和季节性的估  计,适应时间序列数据的变化。
  3、模型中包含的参数(水平、趋势、季节性)易于解释,便于理解时间序列的组成部分。
  4、在短期预测方面,Holt-Winters 方法通常能提供较高的准确性。

缺点

  平滑参数的选择对模型性能有很大影响,通常需要通过经验或交叉验证来优化这些参数,增加了模型设置的复杂性。
  在长周期时间序列的预测中,Holt-Winters 方法可能会产生不切实际的趋势,特别是没有阻尼的情况下,可能导致长期预测的结果不稳定。

三、Python代码和Sentosa_DSML社区版算法实现对比

(一) 数据读入和统计分析

1、python代码实现

#导入需要的库
import os
import pandas as pd
import numpy as np
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from matplotlib import rcParams
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler


file_path = r'.\每月香槟销量.csv'#文件路径
df = pd.read_csv(file_path, header=0)
print("原始数据前5行:")
print(df.head())

>>原始数据前5:
     Month  Perrin Freres monthly champagne sales millions ?64-?72
0  1964-01                                             2815.0     
1  1964-02                                             2672.0     
2  1964-03                                             2755.0     
3  1964-04                                             2721.0     
4  1964-05                                             2946.0     

df = df.rename(columns={
    'Month': '月份',
    'Perrin Freres monthly champagne sales millions ?64-?72': '香槟销量'
})


print("\n修改列名后的数据前5行:")
print(df.head())

>>修改列名后的数据前5:
        月份    香槟销量
0  1964-01  2815.0
1  1964-02  2672.0
2  1964-03  2755.0
3  1964-04  2721.0
4  1964-05  2946.0

  完成数据读入后,对数据进行统计分析,统计数据分布图,计算每一列数据的极值、异常值等结果。代码如下:

stats_df = pd.DataFrame(columns=[
    '列名', '数据类型', '最大值', '最小值', '平均值', '非空值数量', '空值数量',
    '众数', 'True数量', 'False数量', '标准差', '方差', '中位数', '峰度', '偏度',
    '极值数量', '异常值数量'
])

def detect_extremes_and_outliers(column, extreme_factor=3, outlier_factor=5):
    q1 = column.quantile(0.25)
    q3 = column.quantile(0.75)
    iqr = q3 - q1
    
    lower_extreme = q1 - extreme_factor * iqr
    upper_extreme = q3 + extreme_factor * iqr
    lower_outlier = q1 - outlier_factor * iqr
    upper_outlier = q3 + outlier_factor * iqr
    
    extremes = column[(column < lower_extreme) | (column > upper_extreme)]
    outliers = column[(column < lower_outlier) | (column > upper_outlier)]
    
    return len(extremes), len(outliers)

for col in df.columns:
    col_data = df[col]

    dtype = col_data.dtype

    max_value = col_data.max() if np.issubdtype(dtype, np.number) else None
    min_value = col_data.min() if np.issubdtype(dtype, np.number) else None
    mean_value = col_data.mean() if np.issubdtype(dtype, np.number) else None
    non_null_count = col_data.count()
    null_count = col_data.isna().sum()
    mode_value = col_data.mode().iloc[0] if not col_data.mode().empty else None
    true_count = col_data[col_data == True].count() if dtype == 'bool' else None
    false_count = col_data[col_data == False].count() if dtype == 'bool' else None
    std_value = col_data.std() if np.issubdtype(dtype, np.number) else None
    var_value = col_data.var() if np.issubdtype(dtype, np.number) else None
    median_value = col_data.median() if np.issubdtype(dtype, np.number) else None
    kurtosis_value = col_data.kurt() if np.issubdtype(dtype, np.number) else None
    skew_value = col_data.skew() if np.issubdtype(dtype, np.number) else None

    extreme_count, outlier_count = detect_extremes_and_outliers(col_data) if np.issubdtype(dtype, np.number) else (None, None)

    new_row = pd.DataFrame({
        '列名': [col],
        '数据类型': [dtype],
        '最大值': [max_value],
        '最小值': [min_value],
        '平均值': [mean_value],
        '非空值数量': [non_null_count],
        '空值数量': [null_count],
        '众数': [mode_value],
        'True数量': [true_count],
        'False数量': [false_count],
        '标准差': [std_value],
        '方差': [var_value],
        '中位数': [median_value],
        '峰度': [kurtosis_value],
        '偏度': [skew_value],
        '极值数量': [extreme_count],
        '异常值数量': [outlier_count]
    })

    stats_df = pd.concat([stats_df, new_row], ignore_index=True)

print(stats_df)

>>     列名     数据类型      最大值     最小值  ...        峰度        偏度  极值数量 异常值数量
0    月份   object      NaN     NaN  ...       NaN       NaN  None  None
1  香槟销量  float64  13916.0  1413.0  ...  2.702889  1.639003     3     0


rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['SimHei']

output_dir = r'.\holtwinters'#选择路径

if not os.path.exists(output_dir):
    os.makedirs(output_dir)

for col in df.columns:
    plt.figure(figsize=(10, 6))
    df[col].dropna().hist(bins=30)
    plt.title(f"{col} - 数据分布图")
    plt.ylabel("频率")

    file_name = f"{col}_数据分布图.png"
    file_path = os.path.join(output_dir, file_name)
    plt.savefig(file_path)
    plt.close()

在这里插入图片描述
2、Sentosa_DSML社区版实现

  首先,进行数据读入,利用文本算子直接对数据进行读取,选择数据所在路径,
在这里插入图片描述
  同时,可以在文本算子的删除和重命名配置中修改列名或者删除列,这里将列明分别修改为’月份’和 ‘香槟销量’。
在这里插入图片描述
  点击应用,右击预览可以查看数据。
在这里插入图片描述
  接着,利用描述算子即可对数据进行统计分析,得到每一列数据的数据分布图、极值、异常值等结果。连接描述算子,右侧设置极值倍数为3,异常值倍数为5。
在这里插入图片描述
  右击执行,可以得到结果如下:
在这里插入图片描述

(二) 数据预处理

1、python代码实现

#数据预处理
for col in df.columns:
    print(f"列名: {col}, 数据类型: {df[col].dtype}")

>>列名: 月份, 数据类型: object
列名: 香槟销量, 数据类型: float64

df = df.dropna()
df['月份'] = pd.to_datetime(df['月份'], format='%Y-%m', errors='coerce')  

df['香槟销量'] = pd.to_numeric(df['香槟销量'], errors='coerce') 
df = df.dropna(subset=['香槟销量'])
df['香槟销量'] = df['香槟销量'].astype(int)

for col in df.columns:
    print(f"列名: {col}, 数据类型: {df[col].dtype}")
    
print(df)
>>列名: 月份, 数据类型: datetime64[ns]
列名: 香槟销量, 数据类型: int32


filtered_df1 = df[df['月份'] <= '1971-09']
print(filtered_df1)
>>            月份  香槟销量
0   1964-01-01  2815
1   1964-02-01  2672
2   1964-03-01  2755
3   1964-04-01  2721
4   1964-05-01  2946

filtered_df2 = df[df['月份'] > '1971-09']
print(filtered_df2)

>>    月份   香槟销量
93  1971-10-01   6981
94  1971-11-01   9851
95  1971-12-01  12670
96  1972-01-01   4348
97  1972-02-01   3564

filtered_df1.set_index('月份', inplace=True)
resampled_df1 = filtered_df1['香槟销量'].resample('MS').bfill()

print(resampled_df1)

>>     月份   香槟销量
1964-01-01    2815
1964-02-01    2672
1964-03-01    2755
1964-04-01    2721
1964-05-01    2946
              ... 
1971-05-01    5010
1971-06-01    4874
1971-07-01    4633
1971-08-01    1659
1971-09-01    5951

2、Sentosa_DSML社区版实现

  首先,连接格式算子对数据进行格式修改,将月份数据格式由String类型修改为Data类型。
在这里插入图片描述
  其次,对数据进行过滤,将小于等于1971-09的数据作为训练和验证数据集,条件为大于1971-09的数据用于与时序预测数据做对比。可以利用两个过滤算子实现,算子右侧表格中属性“表达式”为spark sql表达式。
  第一个过滤算子,条件为月份<=‘1971-09’,
在这里插入图片描述
  第二个过滤算子条件为月份>‘1971-09’,右击预览即可查看过滤数据。
在这里插入图片描述
  连接时序数据清洗算子,对用于模型训练的数据进行预处理,设置时间列为月份(时间列必须为Data/DataTime类型数据),选择采样频率使时间列数据时间相隔为1月,对香槟销量列以线性方式进行数据填充。
在这里插入图片描述

(三) 模型训练和模型评估

1、python代码实现

#模型定义
model = ExponentialSmoothing(
    resampled_df1, trend='add', seasonal='mul', seasonal_periods=12,damped_trend=True)
fit = model.fit(damping_slope=0.05)

#预测
forecast = fit.predict(
    start=len(resampled_df1), end=len(resampled_df1) + 11
)

residuals = resampled_df1 - fit.fittedvalues
residual_std = np.std(residuals)
upper_bound = forecast + 1.96 * residual_std
lower_bound = forecast - 1.96 * residual_std

results_df = pd.DataFrame({
    '预测值': forecast,
    '上限': upper_bound,
    '下限': lower_bound
})
print(results_df)
>> 月份            预测值            上限            下限
1971-10-01   7143.862498   8341.179324   5946.545672
1971-11-01  10834.141889  12031.458716   9636.825063
1971-12-01  13831.428845  15028.745671  12634.112019
1972-01-01   4054.821228   5252.138054   2857.504402
1972-02-01   3673.653407   4870.970233   2476.336580

#模型评估
y_true = resampled_df1.values
y_pred = fit.fittedvalues.values

def evaluate_model(y_true, y_pred, model_name="Holt-Winters"):
    r_squared = r2_score(y_true, y_pred)
    mae = mean_absolute_error(y_true, y_pred)
    mse = mean_squared_error(y_true, y_pred)
    rmse = mean_squared_error(y_true, y_pred, squared=False)

    print(f"模型评估结果 ({model_name}):")
    print(f"{'-' * 40}")
    print(f"R² (决定系数): {r_squared:.4f}")
    print(f"MAE (平均绝对误差): {mae:.4f}")
    print(f"MSE (均方误差): {mse:.4f}")
    print(f"RMSE (均方根误差): {rmse:.4f}")
    print(f"{'-' * 40}\n")

    return {
        "R²": r_squared,
        "MAE": mae,
        "RMSE": rmse,
        "MSE": mse
    }

evaluation_results = evaluate_model(y_true, y_pred, model_name="Holt-Winters")

>>模型评估结果 (Holt-Winters):
----------------------------------------(决定系数): 0.9342
MAE (平均绝对误差): 451.4248
MSE (均方误差): 402168.8567
RMSE (均方根误差): 634.1678

2、Sentosa_DSML社区版实现
  在时序数据清洗算子后,连接HoltWinters算子,HoltWinters算子根据现有的时间序列对应的数据,预测未来时间的数据。算子的输入数据支持多种key键,但必须是满足相同key键下时间列间隔为固定数值,且数值列非空的时序数据,建议是时序数据清洗算子处理后的数据。
  这里将时间列设为月份列,数据列设为香槟销量列,预测数量和周期性参数设置为12,分析频率为month,模型类型为Multiplicative,显著性水平alpha设置为0.05。
在这里插入图片描述
  模型连接时间序列模型评估算子,右击执行,可以查看评估结果。
在这里插入图片描述
在这里插入图片描述

(四) 模型可视化

1、python代码实现

#可视化
rcParams['font.family'] = 'sans-serif'
rcParams['font.sans-serif'] = ['SimHei'] 

plt.figure(figsize=(12, 6))
plt.plot(resampled_df1, label='实际销量', color='blue')
plt.plot(fit.fittedvalues, label='拟合值', color='orange')
plt.plot(forecast, label='预测销量', color='green')
plt.title('Holt-Winters 方法预测香槟销量')
plt.xlabel('时间')
plt.ylabel('香槟销量')
plt.axvline(x=resampled_df1.index[-1], color='red', linestyle='--', label='预测起始点')
plt.legend()
plt.show()

plt.figure(figsize=(12, 6))
plt.plot(resampled_df1.index, resampled_df1, label='实际值', color='blue')
plt.plot(results_df.index, results_df['预测值'], label='预测值', color='orange')
plt.fill_between(results_df.index, results_df['下限'], results_df['上限'], color='lightgray', alpha=0.5, label='95% 置信区间')
plt.title('Holt-Winters 预测与置信区间')
plt.xlabel('时间')
plt.ylabel('香槟销量')
plt.legend()
plt.show()

filtered_forecast_df = results_df[results_df.index > pd.Timestamp('1971-09-01')]
print(filtered_forecast_df)
>> 月份        预测值            上限            下限
1971-10-01   7143.862498   8341.179324   5946.545672
1971-11-01  10834.141889  12031.458716   9636.825063
1971-12-01  13831.428845  15028.745671  12634.112019
1972-01-01   4054.821228   5252.138054   2857.504402
1972-02-01   3673.653407   4870.970233   2476.336580


results_df = results_df.drop(columns=['上限', '下限'])
print(results_df)
>> 月份         预测值
1971-10-01   7143.862498
1971-11-01  10834.141889
1971-12-01  13831.428845
1972-01-01   4054.821228
1972-02-01   3673.653407
1972-03-01   4531.419772
1972-04-01   4821.096141

results_df.index.name = '月份'
merged_df = pd.merge(filtered_df2, results_df, left_on='月份', right_index=True, how='left')

print(merged_df)
>>         月份   香槟销量           预测值
93  1971-10-01   6981   7143.862498
94  1971-11-01   9851  10834.141889
95  1971-12-01  12670  13831.428845
96  1972-01-01   4348   4054.821228
97  1972-02-01   3564   3673.653407


scaler = StandardScaler()
merged_df[['香槟销量', '预测值']] = scaler.fit_transform(merged_df[['香槟销量', '预测值']])

plt.figure(figsize=(12, 6))
plt.plot(merged_df['月份'], merged_df['香槟销量'], label='香槟销量', color='blue')
plt.plot(merged_df['月份'], merged_df['预测值'], label='香槟预测销量', color='orange')
plt.title('时序图')
plt.xlabel('时间')
plt.ylabel('香槟销量')
plt.legend()
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、Sentosa_DSML社区版实现

  为了对比原始数据和预测数据,首先,利用过滤算子对HoltWinters模型预测数据进行过滤,过滤条件为月份>‘1971-09’。
在这里插入图片描述
  右击预览可以查看数据过滤结果。
在这里插入图片描述
  其次,连接删除和重命名算子,将需要的时间列和预测结果列保留,其余列删除。
在这里插入图片描述
  应用完成后右击即可查看处理结果。
在这里插入图片描述
  然后,连接合并算子,将原始数据和预测数据进行合并,分为关键字合并和顺序合并两种,这里使用关键字合并,用于合并的关键字为月份列,合并方式选择左连接。
在这里插入图片描述
  右击预览可以得到合并算子的处理结果。
在这里插入图片描述
  再连接图表分析中的时序图算子,“序列”可以选择多列,当序列为多列时需要配置“每个序列是否单独显示”,
在这里插入图片描述
  右击执行后可以得到可视化结果,右上方可以进行下载等操作,鼠标移动可以查看当前位置的数据信息,下方可以滑动调整数据的时序区间。
在这里插入图片描述
  对于HoltWinters模型的预测结果,直接连接时序图算子进行图表分析,采用序列模式,对香槟销量实际值和预测值进行对比。
在这里插入图片描述
  右击执行得到结果如下所示:
在这里插入图片描述
  采用时间序列模型模式对于HoltWinters模型的预测结果进行图表分析,属性设置如右侧所示。
在这里插入图片描述
  右击执行得到结果,其中,实心点数据表示原始真实值,实线表示对原始数据的拟合数据,空心虚线表示预测数据,阴影边界的上下虚线分别表示置信区间的预测上限和下限。
在这里插入图片描述

四、总结

  相比传统代码方式,利用Sentosa_DSML社区版完成机器学习算法的流程更加高效和自动化,传统方式需要手动编写大量代码来处理数据清洗、特征工程、模型训练与评估,而在Sentosa_DSML社区版中,这些步骤可以通过可视化界面、预构建模块和自动化流程来简化,有效的降低了技术门槛,非专业开发者也能通过拖拽和配置的方式开发应用,减少了对专业开发人员的依赖。
  Sentosa_DSML社区版提供了易于配置的算子流,减少了编写和调试代码的时间,并提升了模型开发和部署的效率,由于应用的结构更清晰,维护和更新变得更加容易,且平台通常会提供版本控制和更新功能,使得应用的持续改进更为便捷。

  为了非商业用途的科研学者、研究人员及开发者提供学习、交流及实践机器学习技术,推出了一款轻量化且完全免费的Sentosa_DSML社区版。以轻量化一键安装、平台免费使用、视频教学和社区论坛服务为主要特点,能够与其他数据科学家和机器学习爱好者交流心得,分享经验和解决问题。文章最后附上官网链接,感兴趣工具的可以直接下载使用

https://sentosa.znv.com/

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

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

相关文章

Chromium 设置页面打开系统代理源码分析c++

1、前端页面调用showProxySettings() {chrome.send("showProxySettings")} 2、c 响应代码如下 chrome\browser\ui\webui\settings\system_handler.ccvoid SystemHandler::RegisterMessages() {web_ui()->RegisterMessageCallback("showProxySettings",b…

Java Statement SqlTemplate 源码分析

Java Statement SqlTemplate 源码分析 目录概述需求&#xff1a; 设计思路实现思路分析1. 概述2. 关键类3. 主要功能4. 源码结构5. 示例代码6. 性能考虑7. 常见问题8. 总结&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show y…

Meta AI 发布 Llama 3.2

Llama 3.2新闻 Meta公司在其Connect大会上宣布了Llama 3.2的发布&#xff0c;这是其首款能够理解图像和文本的旗舰视觉模型。Llama 3.2包含中型和小型两个版本&#xff08;分别拥有11B与90B参数&#xff09;&#xff0c;以及更轻量化的纯文本模型&#xff08;分别拥有1B与3B参数…

安全的价值:构建现代企业的基础

物理安全对于组织来说并不是事后才考虑的问题&#xff1a;它是关键的基础设施。零售商、医疗保健提供商、市政当局、学校和所有其他类型的组织都依赖安全系统来保障其人员和场所的安全。 随着安全技术能力的不断发展&#xff0c;许多组织正在以更广泛的视角看待他们的投资&am…

element plus block报错

解决&#xff1a; ::v-deep input[aria-hidden"true"] {display: none !important }

二叉树进阶oj题【二叉树相关10道oj题的解析和c++代码实现】

目录 二叉树进阶oj题1.根据二叉树创建字符串2.二叉树的层序遍历3.二叉树的层序遍历 II4.二叉树的最近公共祖先5.二叉搜索树和双向链表6.从前序与中序遍历序列构造二叉树7.从中序和后序遍历序列来构造二叉树8.二叉树的前序遍历&#xff0c;非递归迭代实现9.二叉树中序遍历 &…

日志工具spdlog全解析:理论、安装、使用与实践(C++)

文章目录 前言spdlog 与 glog spdlog介绍内容日志等级输出格式 使用步骤同步日志输出异步日志输出封装一个日志输出类对日志输出类的测试 安装 前言 在编写项目时&#xff0c;通过日志追踪程序错误或其他情况出现的位置是十分重要的&#xff0c;对于不太复杂的场景&#xff0c…

突发:Sam万字长文,OpenAI o1超越人类,o1模型训练原理、微调、能力来源-AI已死,大模型当立

OpenAl o1大模型&#xff1a;原理、突破、前景及影响 北京时间2024年9月13日凌晨&#xff0c;OpenAI正式发布了新的人工智能模型o1&#xff08;o是orion猎户座&#xff0c;1代表从头再来&#xff0c;也意味着后续将出现更多序列&#xff09;&#xff0c;就是此前OpenAI一直在高…

烟雾污染云层检测系统源码分享

烟雾污染云层检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

嵌入式学习--LinuxDay04

嵌入式学习--LinuxDay04 shell脚本 1.1数组 1.1.1数组的赋值 1.1.2数组的调用 1.2函数 1.2.1函数的定义方式 1.2.2函数的调用 2.分文件编程 2.1源文件 2.2头文件 3.编译工具 3.1 gcc编译工具 3.2 gdb调试 4.make工具 4.1定义 4.2Makefile格式 4.3Makefile管理多个文件 4.4Makef…

【笔记】X射线的衍射方向

X射线在晶体中的衍射&#xff0c;实质是大量原子散射波互相干涉的结果。 衍射花样有两个特征&#xff1a; 衍射方向&#xff08;衍射线在空间的分布规律&#xff09;&#xff1a;由晶胞的大小、形状和位向决定。 衍射强度&#xff1a;由原子的种类以及它在晶胞中所处的位置决…

56 门控循环单元(GRU)_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录门控循环单元&#xff08;GRU&#xff09;门控隐状态重置门和更新门候选隐状态隐状态 从零开始实现初始化模型参数定义模型训练与预测 简洁实现小结练习 门控循环单元&#xff08;GRU&#xff09; 之前我们讨论了如何在循环神经网络中计算梯…

PREDATOR: Registration of 3D Point Clouds with Low Overlap

Abstract 这篇文章介绍了一种新的点云配准模型-Predator。该模型专注于处理低重叠的点云对&#xff0c;它更加关注于重叠区域的处理&#xff0c;其新颖之处在于一个重叠的注意块&#xff0c;作用是用于两个点云的潜在编码之间的早期信息交换。该模型大大提高了低重叠场景下的配…

AI跟踪报道第58期-新加坡内哥谈技术-本周AI新闻: OpenAI动荡时刻和Meta从未如此动人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

深度学习与数学归纳法

最近发现&#xff0c;深度学习可以分为两个主要的阶段&#xff0c;分别是前向推理以及反向传播&#xff0c;分别对应着网络的推理和参数训练两个步骤。其中推理有时候也称为归纳推理。 在做参数训练的时候&#xff0c;本质上是在利用历史数据求网络参数的先验分布&#xff1b; …

leetcode每日一题day15(24.9.25)——公司命名

思路&#xff1a;首先如果没有相同的后缀&#xff0c;则无论只要不是相同的首字母交换都不会出现重复情况&#xff0c;如果有重复后缀&#xff0c;则还需多增加个不能和&#xff0c;首字符与另一相同后缀字串的首字符相同的字串交换。 主要矛盾已经明确&#xff0c;则可对矛盾…

MySql5.7.26安装和配置

一.下载&#xff1a; 地址MySQL :: Download MySQL Community Server 1、选择版本 根据自己需要选择32位或64位版本&#xff08;这里选择64位&#xff09;点击下载 进入到下载页面按下图操作 2.解压文件放置位置&#xff1a;这边将下载的文件解压到D:Software 下 解压后内部文…

Linux---文件io

1.系统调用 由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface&#xff0c;API)。是应用程序同系统之间数据交互的桥梁。 C标准函数和系统函数调用关系。一个helloworld如何打印到屏幕。 man手册中一共有九卷&#xff0c;其中一卷就有讲到系…

快速了解graphql特点

graphql--快速了解graphql特点 1.它的作用2.demo示例2.1依赖引入2.2定义schema2.3定义GrapQL端点2.4运行测试2.5一些坑 今天浏览博客时看到graphQL,之前在招聘网站上第一次接触,以为是图数据查询语言, 简单了解后,发现对graphQL的介绍主要是用作API的查询语言,不仅限于图数据查…

目标检测系列(三)yolov2的全面讲解

YOLOv2&#xff08;论文原名《YOLO9000: Better, Faster, Stronger》&#xff09;作为该系列的第二个版本&#xff0c;对原始YOLO进行了显著的改进&#xff0c;进一步提高了检测速度和准确度。在精度上利用一些列训练技巧&#xff0c;在速度上应用了新的网络模型DarkNet19&…