使用 SPSS 对火车进行建模

顺序分析如何预测未来,DB2 为什么比您想象的更智慧

在问题发生之前预测它的能力拥有无可估量的价值。了解 IBM 团队如何与一位火车制造商合作,使用 IBM SPSS Modeler 和 IBM DB2 开发此功能。在本文中,该团队使用 SPSS 识别数据中的模式,使用 DB2 直接在 SQL 中处理比较复杂的数学计算。 本文来自于 IBM Data Management magazine 中文版

Gregory Neuveglise, 预测分析解决方案架构师, IBM

Gregory Neuveglise,IBM 的预测分析解决方案架构师,在实现业务分析方面拥有 10 年丰富经验。他专攻客户关系优化和预测维护。



Marc Fiammante, 杰出工程师,Europe Software Group 解决方案首席架构师, IBM

Marc Fiammante 是一名 IBM 杰出工程师(技术总监)和 IBM SOA Advanced Technology 团队所交付的 SOA 服务的全球首席架构师。他拥有多项软件领域的专利,合著了图书 Service-Oriented Architecture Compass (ibmpressbooks.com/title/0131870025)。



2011 年 9 月 15 日

免费下载:IBM® Cognos® Express V9.5 或者 Cognos® 8 Business Intelligence Developer Edition V8.4 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

- 阅读本文的交互式数字版!

在本质上,火车引人遐想。它们魔术式地勾勒出异地旅行和长途商务出差的愿景。但是火车也非常大、复杂,并且在意外损坏时修理费用昂贵。对于铁路操作人员,在故障发生之前预测它的能力将具有无可估量的价值。

最近,一个 IBM® 团队与欧洲一家火车制造商合作开发了此功能,使用 IBM SPSS® Modeler 和 IBM DB2® 分析火车生成的数据。本文将展示如何使用 SPSS 识别数据中的模式。文中还将展示 IBM DB2 如何为该项目作出杰出贡献,直接在 SQL 中处理一些比较复杂的数学计算。

来自统计数据的预测

在一列现代火车上,会记录 1,000 多种不同类型的机械和电子事件,包括操作事件(比如 “开门” 或 “火车制动”)、警告事件(比如 “线电压频率超出范围” 或 “压缩机 X 的气压过低”)以及故障事件(比如 “缩放仪故障” 或 “变极器锁定”)。在每列火车上每天会收集超过 2,000 个事件。

IBM 提议使用顺序分析确定是否任何这些事件或事件序列表明一个更严重的问题即将发生。顺序分析使用统计建模来检测数据中的模式。例如,它可以显示特定小卖部客户是否在某天购买了婴儿奶粉和尿布,他们很可能在未来的某个时刻购买烩干果(婴儿食品)。


事件的顺序分析

IBM 团队从 2010 年的原始事件数据开始分析:一个 2000 万行的数据集,包含事件时间、事件代码和事件的 GPS 位置。该团队使用 IBM SPSS Modeler 中的顺序节点算法来分析火车数据。顺序分析是一个两阶段的顺序模式挖掘流程 1。首先,该算法挖掘频繁序列的数据并计算一个邻接格。用户然后可以使用指定的条件(比如支持和置信界限),或在先前的序列上设置限制来分析该格子。

使用 IBM SPSS Modeler 工作台(参见图 1),该团队在一个 DB2 数据源节点中定义了输入表,添加了一个 Select 节点来删除火车在维修站时产生的数据,并定义了顺序节点算法中的输入列。该团队还设置将研究哪个时间段的序列,指定仅考虑在一个为期两天的期限内发生的事件。

如图 1 中的屏幕所示,ID 字段表示哪列火车与一个事件序列相关,Time 字段描述序列的时间顺序,Content 字段包含发生的事件的代码。

图 1. ID、Time 和 Content 字段
来自 SPSS Modeler 的屏幕截图

SPSS Modeler 规则集界面显示 SPSS 在分析完成后找到的规则(参见图 2)。突出显示的规则显示了一个前序序列 (21382, 29203),后跟一个后续序列(在本例中为一个事件:18232),具有 55.7% 的支持 评级和 93.1% 的置信 评级。这表明在 2010 年,这个前序序列出现在 55.7% 的火车中,在 93.1% 的时间内发生了后续序列。

图 2. 规则集界面
规则集界面,显示分析的结果。序列节点找到了 12,358 条规则。

一旦计算出了规则,就可以使用 SPSS Modeler 过滤工具浏览数据(参见图 3)。依据该数据,在 76.9% 的情况下,代码为 2201 的事件发生在代码为 2003 的事件之后,在 84.6% 的情况下发生在代码为 2001 的事件之后。因为事件代码 2201 表示使火车停止并导致延迟的故障,所以此信息可用于优化维护规划:如果出现事件代码 2001,应该尽可能早地检查与此代码相关的设备,以避免故障。

图 3. 应用于事件代码 2201 的过滤器
应用于事件代码 2201 的过滤器。一条规则表明在 87.2% 的情况下,在代码为 2201 的事件之前发生了两次代码为 2001 的事件。

火车在站上吗?

前面已经提到,该团队需要消除火车在维修站维修期间记录的数据,该服务流程以不会影响火车系统实际行为的方式触发传感器。检测在维修期间发生的事件的最佳方式是,使用著名的点包容 (Point-in-polygon) 算法(参见图 4 和 图 5)来计算在记录一个事件时,火车相对于维修站的位置。制造商有一个已经定义了维修站多边形的现成的表。

如图 4 中所示,点包容问题的解决方案是绘制一条从所关注的点开始的水平线。如果该点位于多边形内,该线将与多边形的边相交奇数次。

图 4. 点包容解决方案
点包容问题的解决方案是绘制一条从所关注的点开始的水平线。如果该点位于多边形内,该线将与多边形的边相交奇数次。

如果所绘制的水平线与一个多边形顶点对齐,那么只会计算位于该线下方的部分。

图 5. 与一个多边形顶点对齐的水平线
如果所绘制的水平线与一个多边形顶点对齐,那么只会计算位于该线下方的部分

最初,该团队认为计算应该在 Visual Basic 或 Java 应用程序内执行。但面对着要处理的 2000 万行事件,该团队迅速断定这些解决方案还不够快。他们在 IBM DB2 中直接使用 SQL 实现了计算算法。(备注:IBM DB2 Spatial Extender 提供了一个原生函数来确定给定的几何图形是否落入另一个几何图形边界内。)


在 SQL 中实现点包容算法

为了在 SQL 中表达点包容算法,该团队首先构建了一对函数来将经纬度坐标转换为数学上的 X 和 Y 平面坐标:

  • X(经度)实现为 GetX SQL 函数: CASE WHEN LonDeg <= 180 THEN -1 * (LonDeg + (DOUBLE(LonMin) + DOUBLE(LonSec)/100)/60) ELSE (360 - LonDeg - (DOUBLE(LonMin) + DOUBLE(LonSec)/100)/60) END
  • Y(纬度)实现为 GetY SQL 函数: CASE WHEN LatDeg <= 90 THEN -1 * (LatDeg + (DOUBLE(LatMin) + DOUBLE(LatSec)/100)/60) ELSE ((LatDeg + (DOUBLE(LatMin) + DOUBLE(LatSec)/100)/60)-90) END

接下来,该团队构建了一个多边形线段表。他们创建了一个包含多边形段坐标 X1,Y1 和 X2,Y2 的 POLYSEG 表,跟踪线段顺序。他们使用一种 CASE WHEN … THEN ELSE END 结构来检测给定点是否是表中的第一个点。如果是,它将成为最后一个线段的终点。否则,代码将前进到下一个点:

清单 1. POLYSEG 表
SELECT p1.DepotID,p1.DepotName,p1.CoordinateRank,p2.GPSOrder, 
GetX(p1.LonDeg,p1.LonMin,p1.LonSec), 
GetY(p1.LatDeg,p1.LatMin,p1.LatSec), FROM POLYGONS p1,POLYGONS p2 
WHERE p1. DepotID=p2. DepotID AND p2.GPSOrder=CASE 
WHEN p1.CoordinateRank=(SELECT MAX(p3.CoordinateRank) 
FROM POLYGONS p3 WHERE p3. DepotID =p1.DepotID) THEN 1 ELSE p1.DepotID +1 END;

要检测未与一个顶点对其的一个点右侧的交点数量,首先使用水平线与一个线段 (Xi) 相交的坐标公式:

Xi=X1+(Y-Y1)*(X2-X1)/(Y2-Y1)

图 6. 水平线与一个线段相交
水平线与一个线段相交

对于一条给定的与线段相交的水平线,使用 X<=Xi 或:

X<=X1+(Y-Y1)*(X2-X1)/(Y2-Y1)

要避免任何数与 0 相除或溢出,将所有除法转换为乘法并检查运算符号(Y2=Y1 的水平线不会计入算法):

IF (Y2-Y1)>0 then X*(Y2-Y1)<=X1*(Y2-Y1)+ (Y-Y1)*(X2-X1)

IF (Y2-Y1)<0 then X*(Y2-Y1)>=X1*(Y2-Y1)+ (Y-Y1)*(X2-X1)

计算一个相交的线段的结果 WHERE 子句如下所示:

清单 2. WHERE 子句表
WHERE Y2<>Y1 AND (((Y2-Y1)*(TEMP.Y-Y1)>0 
AND TEMP.X*(Y2-Y1)*(TEMP.Y-Y1)<=X1*(Y2-Y1)*(TEMP.Y-Y1)+X2-X1)
OR ((Y2-Y1)*(TEMP.Y-Y1)<0 
AND TEMP.X*(Y2-Y1)*(TEMP.Y-Y1)>=X1*(Y2-Y1)*(TEMP.Y-Y1)+X2-X1)) 
AND (TEMP.Y>Y1 OR TEMP.Y>Y2)
AND (TEMP.Y<Y1 OR TEMP.Y<Y2)

要处理与一个线段顶点对齐的线上的点,必须使用仅计算低于该线的线段的子句:

OR (TEMP.X<TEMP.X1 AND TEMP.Y=Y1 AND Y1>Y2)

OR (TEMP.X<TEMP.X2 AND TEMP.Y=Y2 AND Y2>Y1)


删除来自维修站的事件

要实际计算交点,可以识别具有奇数次相交的点,然后使用 GROUP BY 和 HAVING 子句筛选出这些点。请注意,COUNT 是一个整数。在奇数除法中,它不会保留小数部分,这就是它可用于测试奇数的原因。

GROUP BY EVENT.ID, P.DepotName HAVING COUNT(*)-2*(COUNT(*)/2)=1)

最后,该团队需要将每项数据组装到一个表中,使用维修站位置、名称或 null 更新事件表。完整的 SQL 为:

清单 3. 完整的 SQL 代码
CREATE OR REPLACE PROCEDURE UpdateGPSLocation
 BEGIN
  DECLARE SQLCODE INTEGER;
  DECLARE nbrows INTEGER DEFAULT 0;
  DECLARE batchsize INTEGER DEFAULT 10000; 
  DECLARE t1 TIMESTAMP;
  DECLARE t2 TIMESTAMP;
  SET T1=CURRENT TIMESTAMP;
  loop: LOOP
  CALL DBMS_OUTPUT.PUT_LINE('Updating '||nbrows||' rows...');
  UPDATE EVENTS
    SET X = 1,
    Location = (SELECT P.LOCATIONNAME FROM POLYSEGS P,
    TABLE(values(CASE WHEN LonDeg <= 180 THEN -1 * 
    (LonDeg + (DOUBLE(LonMin) +DOUBLE(LonSec)/100)/60)
    ELSE (360 - LonDeg - (DOUBLE(LonMin) + DOUBLE(LonSec)/100)/60) END,
    CASE WHEN LatDeg <= 90 THEN -1 * (LatDeg + (DOUBLE(LatMin) + DOUBLE(LatSec)/100)/60)
    ELSE ((LatDeg + (DOUBLE(LatMin) + DOUBLE(LatSec)/100)/60)-90) END
    )) as TEMP(X,Y)
    WHERE (Y2<>Y1 AND (((Y2-Y1)*(TEMP.Y-Y1)>0 AND
    TEMP.X*(Y2-Y1)*(TEMP.Y-Y1)<=X1*(Y2-Y1)*(TEMP.Y-Y1)+X2-X1)
    OR ((Y2-Y1)*(TEMP.Y-Y1)<0 
    AND TEMP.X*(Y2-Y1)*(TEMP.Y-Y1)>=X1*(Y2-Y1)*(TEMP.Y-Y1)+X2-X1))
    AND (TEMP.Y>Y1 OR TEMP.Y>Y2)
    AND (TEMP.Y<Y1 OR TEMP.Y<Y2))
    OR (TEMP.X<TEMP.X1 AND TEMP.Y=Y1 AND Y1>Y2) 
    OR (TEMP.X<TEMP.X2 AND TEMP.Y=Y2 AND Y2>Y1)
    GROUP BY TMSEVENTS.ID, P.LOCATIONNAME
    HAVING COUNT(*)-2*(COUNT(*)/2)=1)
    WHERE ID IN (SELECT T.ID FROM EVENTS as T
    WHERE T.X <> 1 OR T.X IS NULL
    AND T.LatMin IS NOT NULL
    FETCH FIRST 10000 ROWS ONLY);
  IF SQLCODE = 100 THEN
   LEAVE loop;
 END IF;
 COMMIT;
 SET nbrows=nbrows + batchsize;
END LOOP;
SET T1=CURRENT TIMESTAMP;
CALL DBMS_OUTPUT.PUT_LINE('T1: '||T1||' T2:'|| T2);
END
@
CALL UpdateGPSLocation

最后的代码在不到 1 小时内更新 2000 万行的表,识别在维修站中发生的事件,因为此更新会每月执行一次,所以此性能是可接受的。使用合适的索引和 EXPLAIN 代码的更多优化可用于提高性能。


保持火车持续开动

该团队证明了 IBM SPSS Modeler 通过动态计算置信度和在需要时生成警告,提供了自动化实时故障预测的能力。此外,DB2 提供了先进的 SQL 功能来帮助处理复杂的查询,包括地理空间数据和复杂计算。要看到真实收益,可以考虑通过减少紧急修理的需要来省钱。或者考虑使用所学知识让下一代火车更加可靠。或者可能只是想想火车旅行者:在火车安静地向下一个令人激动的目标飞驰时,迎风欣赏漂亮的风景。


脚注

  • 1 Rakesh Agrawal 和 Ramakrishnan Srikant,挖掘顺序模式,(美国加利福尼亚圣何塞:IBM,1995 年)
参考文章
最大限度地提高数据分析性能
合作伙伴资源
Applied Analytix, Inc DBIIBM
IBM Information On DemandInternational DB2 Users Group (IDUG)Melissa Data
NetezzaNiteo PartnersQueBIT
Quest Software

参考资料

学习

获得产品和技术

讨论

  • 通过访问 alphaWorks 获得更多 IBM 的前瞻性技术和资源。
  • 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=757822
ArticleTitle=使用 SPSS 对火车进行建模
publish-date=09152011