﻿ 基于改进Apriori算法的糖尿病预诊系统
 计算机系统应用  2019, Vol. 28 Issue (2): 94-100 PDF

Diabetes Prediagnosis System Based on Improved Apriori Algorithm
ZHANG Chong, ZHANG Yun-Hua
School of Information Science and Technology, Zhejiang Sci-Tech University, Hangzhou 310018, China
Abstract: This study has improved Apriori algorithm and applied it to association analysis of diabetic risk factors. The improved algorithm transforms transaction database into a Boolean matrix in one scan time and compressing matrix according to its specific properties, it greatly reduces computation and redundancy through this way. Based on above, a diabetes prediagnosis system has been designed which adopts the latest technology stack such as micro-service framework Spring Boot and RPC framework Dubbo, RabbitMQ as message queue middleware, Redis as cache, and MySQL as database. The system assists medical staff in diagnosing diabetes and provides an effective basis for users’ self-diagnosis.
Key words: Apriori algorithm     diabetes     association analysis     micro service     prediagnosis system

1 引言

2 改进算法 2.1 经典Apriori算法

 $R = X \to Y(X \cap Y = \varnothing)$ (1)

 $s(X \to Y) = \frac{{\sigma (X \cup Y)}}{{\left| T \right|}}$ (2)

 $c(X \to Y) = \frac{{\sigma (X \cup Y)}}{{\sigma (X)}}$ (3)

 $\begin{array}{l} s(X \to Y) \ge min\_sup\\ c(X \to Y) \ge min\_conf \end{array}$ (4)

k-项集为 ${C_k}$ , 记频繁k-项集为 ${F_k}$ , 记事务长度为 $\left| {{T_k}} \right|$ , Apriori算法有如下三条性质:

2.2 改进Apriori算法

 {\overline {{B_i}} = \left[ {\begin{aligned} {{t_{1i}}} \\ {{t_{2i}}} \\ \vdots \\ {{t_{mi}}} \end{aligned}} \right]}, \quad {{t_{ji}} = \left\{ {\begin{aligned} & {0,}\quad {I \notin {T_i}} \\ & {1,}\quad{I \in {T_i}} \end{aligned}} \right.} (5)

 ${\bf{B}} = \left[ {\begin{array}{*{20}{c}} {\overline {{B_1}} }&{\overline {{B_2}} }& \cdots &{\overline {{B_n}} } \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {{t_{11}}}&{{t_{12}}}& \cdots &{{t_{1n}}} \\ {{t_{21}}}&{{t_{22}}}& \cdots &{{t_{2n}}} \\ \vdots & \vdots &{}& \vdots \\ {{t_{m1}}}&{{t_{m2}}}& \cdots &{{t_{mn}}} \end{array}} \right]$ (6)

 $\overline {{B_i}} \cdot \overline {{B_j}} = \left[ {\begin{array}{*{20}{c}} {{t_{1i}} \times {t_{1j}}} \\ {{t_{2i}} \times {t_{2j}}} \\ \vdots \\ {{t_{mi}} \times {t_{mj}}} \end{array}} \right]$ (7)

 $\sigma \left( {\overline {{B_i}} } \right) \ge \left| {\rm{T}} \right| \times min\_sup$ (8)

 $\left| {{{{T}}_{id}}} \right| \ge k$ (9)

① 输入事务数据库T, 如表1. 输入最小支持度 $min\_sup = 0.5$ , 最小置信度 $min\_conf = 0.7$ .

② 扫描事务数据库, 建立候选布尔矩阵 ${{\bf{B}}'_1}$ , 并于首行首列和末行末列各类辅助值, 如表2所示.

③ 根据规则1压缩矩阵B'1, 即保留A、B、C、D列, 得到矩阵B1表3. 分析B1得频繁1-项集如下:

 ${F_1} = \left\{ {\begin{array}{*{20}{c}} {\left\{ A \right\}}&{\left\{ B \right\}}&{\left\{ C \right\}}&{\left\{ D \right\}} \end{array}} \right\}$

④ 根据规则2压缩矩阵 ${{\bf{B}}_1}$ , 即保留所有行; 再根据规则3对矩阵 ${{\bf{B}}_1}$ 进行自身连接, 即连接AB、AC、AD、BC、BD、CD列; 最后得到矩阵 ${{\bf{B}}'_2}$ 表4.

⑤ 重复③: 根据规则1压缩矩阵 ${{\bf{B}}'_2}$ , 即保留AB、AC、BC、CD列, 得到矩阵 ${{\bf{B}}_2}$ 表5. 分析 ${{\bf{B}}_2}$ 可得频繁2-项集和关联规则如下:

 $\begin{split} & {F_2} = \left\{ {\begin{array}{*{20}{c}} {\left\{ {AB} \right\}} & {\left\{ {AC} \right\}} & {\left\{ {BC} \right\}} & {\left\{ {CD} \right\}} \end{array}} \right\}\\ & {R_2} = \left\{ {\begin{array}{*{20}{c}} {\left\{ {A \to B} \right\}} & {\left\{ {B \to A} \right\}} & {\left\{ {D \to C} \right\}} \end{array}} \right\} \end{split}$

⑥ 以此类推, 根据规则1和规则2不断压缩矩阵, 直到 ${{\bf{B}}'_i} \ne \emptyset$ , 算法结束.

input min_sup, min_conf, k = 0; scan transaction T

 ${{{\bf{B}}'}_1} = \left[\!\!{\begin{array}{*{20}{c}} {}&{\overline {{B_1}} }&{\overline {{B_2}} }& \cdots &{\overline {{B_{\text{i}}}} }&{\left| {{T_{id}}} \right|} \\ {{T_{id1}}}&{{t_{11}}}&{{t_{12}}}& \cdots &{{t_{1i}}}&{\sum\limits_{j = 1}^i {{t_{1i}}} } \\ {{T_{id2}}}&{{t_{21}}}&{{t_{22}}}& \cdots &{{t_{2i}}}&{\sum\limits_{j = 1}^i {{t_{2i}}} } \\ \vdots & \vdots & \vdots &{}& \vdots & \vdots \\ {{T_{i{d_{\left| T \right|}}}}}&{{t_{\left| T \right|1}}}&{{t_{\left| T \right|2}}}& \cdots &{{t_{\left| T \right|i}}}&{\sum\limits_{j = 1}^i {{t_{\left| T \right|i}}} } \\ {\sigma (\overline {{B_i}} )}&{\sum\limits_{j = 1}^{\left| T \right|} {{t_{j1}}} }&{\sum\limits_{j = 1}^{\left| T \right|} {{t_{j2}}} }& \cdots &{\sum\limits_{j = 1}^{\left| T \right|} {{t_{ji}}} }&{} \end{array}}\!\!\right]$

do

k = k + 1

for each $\overline {{B_i}} \in {{{\bf{B}}'}_k}$

if $(\sigma (\overline {{B_i}} ) < \left| T \right| \times min\_sup)$ delete $\sum {col(\overline {{B_i}} )}$

gain ${{\bf{B}}_k}$ and output frequent itemsets Fk

for each $f_k^* \subseteq (every {{{f}}_k} \in {F_k})$ and $f_k^* \ne \emptyset$

if $(\frac{{\sigma ({f_k})}}{{\sigma (f_k^*)}} \geqslant min\_conf)$ output rule $f_k^* \to {{{f}}_k} - {{f}}_k^*$

for each ${{{T}}_{id}} \in T$

if $(\left| {{T_{id}}} \right| < k)$ delete $\sum {row({T_{id}})}$

for each $\overline {{B_i}} ,\overline {{B_j}} \in {{{\bf{B}}'}_k}$

if ( $ite{m_i} = ite{m_j}$ from 1 to k - 2) $\overline {{B_{ij}}} = \overline {{B_i}} \cdot \overline {{B_j}}$

gain ${{{\bf{B}}'}_{k + 1}}$

while $({{{\bf{B}}'}_{k + 1}} \ne \emptyset )$

2.3 算法分析与对比

 图 1 最小支持度与运行时间

 图 2 最小支持度与频繁项集数

3 糖尿病预诊系统设计 3.1 糖尿病高危因素分析

3.2 系统架构设计

Dubbo是一款开源RPC框架, 它提供了三大核心能力: 面向接口的远程方法调用, 智能容错和负载均衡, 以及服务自动注册和发现. 该框架不仅实现了高性能、高可用性, 而且使用方便, 扩展性极佳[12].

Spring Boot是Java领域知名的微服务框架, 微服务的目的在于化解整体架构服务的复杂性, 以简单快速的方式实现各个服务的部署和变更. 而Spring Boot提供了形式多样的库, 支持JPA、RESTFul、Docker等技术, 能够让配置、部署和监控变得简单方便[13].

RabbitMQ基于Erlang语言编写, 用于在分布式系统中存储转发异步消息, 将彼此独立的计算机连接起来组成松耦合的系统, RabbitMQ在易用性扩展性、高可用性等方面表现不俗[14].

MySQL是一款由瑞典的公司开发并且广泛应用于中小型企业或组织的免费数据库, 基于Linux 操作系统开发, MySQL体积小、速度快、总体拥有成本低.

Redis是一款基于内存的、可持久化的非关系型Key-Value存储系统, 它支持多种数据类型, 并支持原子性操作[15]. Redis与其他Cache相比, 拥有更多的数据结构并支持更丰富的数据操作.

 图 3 糖尿病预诊系统架构图

3.3 系统流程设计

 图 4 糖尿病预诊系统流程图

① 当用户提交自查请求, 网关层会对请求做权限认证、接口限流令牌校验、安全处理等. 随后会生产一条异步消息推送至RabbitMQ, 由代理层消费消息并路由至具体服务, 实现规则匹配和异步结果返回.

② 当用户电子病历记录为空时, 医护人员录入用户各项相关数据. 数据提交后, 代理层调用具体服务处理数据, 生成电子病历并存储入库.

③ 当管理员提交关联规则挖掘请求时, 网关层对权限进行校验, 随后代理层路由至具体服务, 使用改进Apriori算法在后台对数据集进行筛选和挖掘. 在关联规则落库后, 以站内信和其他特定方式通知管理员关联规则的挖掘结果.

3.4 系统核心配置和UI设计

HIS子系统服务提供者配置文件provide.xml核心内容如下, 其中包括暴露的服务接口及注册地址:

<dubbo:application logger="slf4j"

name="${dubbo.application-name}"/> <dubbo:protocol name="dubbo" charset="UTF-8" port="${dubbo.port}" serialization="java"/>

<dubbo:registry username="root"

address="${dubbo.registry-address}"/> <!-- 声明需要暴露的服务接口 --> <dubbo:service version="${dubbo.service-version}"

ref="hisRemoteService"

interface="com.heren.ois.rpc.

hisInterface.service.HisRemoteService"/>

<!-- 服务接口 -->

<dubbo:reference id="hisRemoteService"

version="\${dubbo.service-version}"

interface="com.heren.ois.rpc.

hisInterface.service.HisRemoteService"/>

public interface HisRemoteService {

Patient findPatientBy(String MedicalNo);

List<Patient> findListByNameAndGender(

String name, Integer gender

);

Map<String, List<MedicalRecord>>

findMedicalRecordListBy(Patient patient);

Map<String, List<Diagnosis>>

findDiagnosisListBy(Patient patient);

}

3.5 预诊结果分析

 图 5 糖尿病预诊分析界面

 图 6 电子病历部分数据

 图 7 量化后的数据

4 结束语

 [1] Yıldırım EG, Karahoca A, Uçar T. Dosage planning for diabetes patients using data mining methods. Procedia Computer Science, 2011, 3: 1374-1380. DOI:10.1016/j.procs.2011.01.018 [2] 李武成, 王官权, 金科. 2型糖尿病并发高血压的危险因素分析. 实用医学杂志, 2010, 26(17): 3180-3181. DOI:10.3969/j.issn.1006-5725.2010.17.045 [3] 董宁. 基于数据挖掘的Apriori算法研究与改进. 自动化与仪器仪表, 2016(9): 232-234. [4] 张伟科. 一种改进的AprioriTid算法. 沈阳工业大学学报, 2016, 38(3): 314-318. [5] 苗苗苗, 王玉英. 基于矩阵压缩的Apriori算法改进的研究. 计算机工程与应用, 2013, 49(1): 159-162. DOI:10.3778/j.issn.1002-8331.1107-0579 [6] 王蒙, 邹书蓉, 方睿. 一种基于矩阵的Apriori改进算法. 信息技术, 2018(3): 150-154, 158. [7] 周发超, 王志坚, 叶枫, 等. 关联规则挖掘算法Apriori的研究改进. 计算机科学与探索, 2015, 9(9): 1075-1083. [8] 李超, 余昭平. 基于矩阵的Apriori算法改进. 计算机工程, 2006, 32(23): 68-69. DOI:10.3969/j.issn.1000-3428.2006.23.024 [9] 杨志刚, 何月顺. 基于压缩事务矩阵相乘的Apriori改进算法. 中国新技术新产品, 2010(6): 57-58. DOI:10.3969/j.issn.1673-9957.2010.06.045 [10] 冯玉欣, 赵希兵. 2型糖尿病家系发病特征与危险因素调查. 糖尿病新世界, 2017, 20(12): 19-20. [11] 韦哲, 叶广健. 一种Apriori改进算法在2型糖尿病危险因素分析中的应用. 电子测试, 2015(17): 63-65, 84. DOI:10.3969/j.issn.1000-8519.2015.17.026 [12] 陈晓栋. 基于Dubbo分布式框架的信用卡无卡大额分期系统设计. 信息与电脑, 2017(7): 132-135. DOI:10.3969/j.issn.1003-9767.2017.07.051 [13] 温晓丽, 苏浩伟, 陈欢, 等. 基于SpringBoot微服务架构的城市一卡通手机充值支撑系统研究. 电子产品世界, 2017, 24(10): 59-62. [14] 鱼朝伟, 詹舒波. 基于RabbitMQ的异步全双工消息总线的实现. 软件, 2016, 37(2): 139-146. DOI:10.3969/j.issn.1003-6970.2016.02.032 [15] 曾超宇, 李金香. Redis在高速缓存系统中的应用. 微型机与应用, 2013, 32(12): 11-13. DOI:10.3969/j.issn.1674-7720.2013.12.004