ABAP-简单线性回归的案例

举报
Mr_blank 发表于 2025/03/27 09:59:14 2025/03/27
【摘要】 * 数据类型定义TYPES: BEGIN OF ty_data, x TYPE f, " 自变量 y TYPE f, " 因变量 END OF ty_data.DATA: lt_data TYPE TABLE OF ty_data, " 样本数据存储 ls_data LIKE LINE OF lt_data...
* 数据类型定义
TYPES: BEGIN OF ty_data,
         x TYPE f,        " 自变量
         y TYPE f,        " 因变量
       END OF ty_data.

DATA: lt_data TYPE TABLE OF ty_data,   " 样本数据存储
      ls_data LIKE LINE OF lt_data.

* 统计计算变量
DATA: lv_x_sum      TYPE f,            " X总和
      lv_y_sum      TYPE f,            " Y总和
      lv_x_avg      TYPE f,            " X平均值
      lv_y_avg      TYPE f,            " Y平均值
      lv_n          TYPE i,            " 数据点数量
      lv_covariance TYPE f,            " 协方差
      lv_variance   TYPE f,            " 方差
      lv_b          TYPE f,            " 斜率
      lv_a          TYPE f.            " 截距

* 示例数据:(X)与(Y)的对应关系
lt_data = VALUE #(
  ( x = 202501  y = 200 )
  ( x = 202502  y = 250 )
  ( x = 202503  y = 300 )
  ( x = 202504  y = 350 )
  ( x = 202505  y = 400 ) ).

* 获取数据点数量
lv_n = lines( lt_data ).
IF lv_n < 2.
  WRITE: / '至少需要两个数据点'.
  RETURN.
ENDIF.

* 计算X/Y总和
LOOP AT lt_data INTO ls_data.
  lv_x_sum = lv_x_sum + ls_data-x.
  lv_y_sum = lv_y_sum + ls_data-y.
ENDLOOP.

* 计算平均值
lv_x_avg = lv_x_sum / lv_n.
lv_y_avg = lv_y_sum / lv_n.

* 计算协方差和方差
LOOP AT lt_data INTO ls_data.
  lv_covariance = lv_covariance + ( ls_data-x - lv_x_avg ) * ( ls_data-y - lv_y_avg ).
  lv_variance   = lv_variance   + ( ls_data-x - lv_x_avg ) ** 2.
ENDLOOP.

* 计算回归系数
IF lv_variance = 0.
  WRITE: / '错误:X方差为零,无法计算回归系数'.
  RETURN.
ENDIF.

lv_b = lv_covariance / lv_variance.     " 斜率 = 协方差 / X方差
lv_a = lv_y_avg - lv_b * lv_x_avg.      " 截距 = Y平均值 - 斜率*X平均值

* 结果输出
WRITE: / '线性回归方程: Y = ', lv_a, ' + ', lv_b, ' * X'.
WRITE: / '-------------------------------------------'.
WRITE: / '统计指标:'.
WRITE: / |数据点数量: { lv_n }|.
WRITE: / |X平均值: { lv_x_avg NUMBER = ENVIRONMENT }|.
WRITE: / |Y平均值: { lv_y_avg NUMBER = ENVIRONMENT }|.
WRITE: / |协方差: { lv_covariance NUMBER = ENVIRONMENT }|.
WRITE: / |方差: { lv_variance NUMBER = ENVIRONMENT }|.
WRITE: / |斜率 (b): { lv_b NUMBER = ENVIRONMENT }|.
WRITE: / |截距 (a): { lv_a NUMBER = ENVIRONMENT }|.

* 可选:预测示例(预测X=202506时的Y值)
DATA(lv_prediction) = lv_a + lv_b * 202506.
WRITE: / '-------------------------------------------'.
WRITE: / '预测应用:当X=202506 时,Y预测值 =', |{ lv_prediction NUMBER = ENVIRONMENT }|.
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。