当前位置:文档之家› 用MATLAB实现大数据挖掘地一种算法

用MATLAB实现大数据挖掘地一种算法

用MATLAB实现大数据挖掘地一种算法
用MATLAB实现大数据挖掘地一种算法

一、数据挖掘的目的

数据挖掘(Data Mining)阶段首先要确定挖掘的任务或目的。数据挖掘的目的就是得出隐藏在数据中的有价值的信息。数据挖掘是一门涉及面很广的交叉学科,包括器学习、数理统计、神经网络、数据库、模式识别、粗糙集、模糊数学等相关技术。它也常被称为“知识发现”。知识发现(KDD)被认为是从数据中发现有用知识的整个过程。数据挖掘被认为是KDD过程中的一个特定步骤,它用专门算法从数据中抽取模式(patter,如数据分类、聚类、关联规则发现或序列模式发现等。数据挖掘主要步骤是:数据准备、数据挖掘、结果的解释评估。

二、数据挖掘算法说明

确定了挖掘任务后,就要决定使用什么样的挖掘算法。由于条件属性在各样本的分布特性和所反映的主观特性的不同, 每一个样本对应于真实情况的局部映射。建立了粗糙集理论中样本知识与信息之间的对应表示关系, 给出了由属性约简求约简决策表的方法。基于后离散化策略处理连续属性, 实现离散效率和信息损失之间的动态折衷。提出相对值条件互信息的概念衡量单一样本中各条件属性的相关性, 可以充分利用现有数据处理不完备信息系统。

本次数据挖掘的方法是两种,一是找到若干条特殊样本,而是找出若干条特殊条件属性。最后利用这些样本和属性找出关联规则。(第四部分详细讲解样本和属性的选择)

三数据预处理过程

数据预处理一般包括消除噪声、推导计算缺值数据、消除重复记录、完成数据类型转换(如把连续值数据转换为离散型数据,以便于符号归纳,或是把离散型数据转换为连续)。

本文使用的数据来源是名为“CardiologyCategorical”的excel文件中的“源数据”。该数据表共303行,14个属性。即共有303个样本。将该数据表的前200行设为训练样本,剩下后的103行作为测试样本,用基于粗糙集理论的属性约简的方法生成相应的规则,再利用测试样本对这些规则进行测试。

首先对源数据进行预处理,主要包括字符型数据的转化和数据的归一化。

数据预处理的第一步是整理源数据,为了便于matlab读取数据,把非数字数据转换为离散型数字数据。生成lisanhua.xsl文件。这一部分直接在excel工作表中直接进行。

步骤如下:

将属性“sex”中的“Male”用“1”表示,“Female”用“2”表示;

将属性“chest pain type”中的“Asymptomatic”用“1”表示,“Abnormal Angina”用“2”表示,“Angina”用“3”表示,“NoTang”用“4”表示;

将属性“Fasting blood suga<120”与属性“angina”中的“FALSE”用“1”表示,“TRUE”用“2”表示;

将属性“resting ecg”中的“Hyp”用“1”表示,“Normal”用“2”表示,“Abnormal”用“3”表示;

将属性“slope”中的“Down”用“1”表示,“Flat”用“2”表示,“Up”用“3”表示,;

将属性“thal”中的“Rev”用“1”表示,“Normal”用“2”表示,“Fix”用“3”表示;

将属性“class”中的“Healthy”用“1”表示,“Sick”用“2”表示;

数据预处理的第二步:使用

dm=xlsread('lisanhua');

导入’lisanhua’.xls文件,在MATLAB中对一些连续属性值离散化。

如下:

1、[29,48]=1,[48,62]=2,[62,77]=3

4、[94,110]=1,[110,143]=2,[143,200]=3

5、[126,205]=1,[205,293]=2,[293,564]=3

8、[71,120]=1,[120,175]=2,[175,202]=3

10、[0,1.5]=1,[1.5,2.5]=2,[2.5,6.2]=3。

然后对数据进行归一化处理:

由于不同属性之间的属性值相同,所以利用下面语句对一共13个条件属性中的38个属性进行如下赋值,使每条属性唯一确定。从而得到38个条件属性,只不过38个里面有且只能出现13个。

程序如下:

m1=[0,3,2,4,3,3,2,3,3,2,3,3,4,3];k=1;w=m1(k);dm3=dm2;

for i=1:3939

dm3(i)=dm2(i)+w;

if rem(i,303)==0

k=k+1;

w=w+m1(k);

end

end

从而得到dm(3)矩阵。而且决策属性分为1:healthy;2:sick。

并且在38个条件属性中没有值为0。

四、挖掘算法

1、特殊样本

首先在前200条样本中分别找出三条对应两种决策属性的重要样本,样本必须满足在同类决策属性下其他199条的13条决策属性中和它的13条条件属性数目大于等于10的前3条样本。

2、特殊条件属性值

其次分别对应两条决策属性值的5条重要条件属性值(在38个条件属性里找),特殊属性值必须满足:(1)在对应相同决策属性下,此决策属性支持率必须在前五,(2)而且如果不同决策属性出现相同条件属性。如果相同决策属性同时出现在不同决策属性中,删除这条后找支持率第六的条件属性,以此类推。

挖掘算法在MATLAB里列出并做了标注。

五、验证程序

1、预处理

在验证程序里面分别对测试数据和六条样本做了对比,又对其属性值和特殊属性值做了对比,最后利用加权求和算法判断测试样本的决策属性正确率。

其中:nc,mc代表测试数据分别和两类样本属性中相同数是否大于等于9时的加权值。ncc,mcc代表测试数据分别和两类特殊属性满足几条数目的加权值。

2、关联规则

(1)、如果(nc>=0.9&ncc>=8)|(ncc>=10&nc>=0.6) 得到决策属性healthy

(2)、不满足以上条件的话如果(mc>=0.9|mcc>=8)|(mcc>=9&mc>=0.6) 得到决策属性sick。

(3)、不满足以上条件的话如果nc>=(mc+0.3)|ncc>=(mcc+2) 得到决策属性healthy。

(4)、不满足以上条件的话如果mc>nc 得到决策属性为sick。

(5)、不满足以上条件的话如果ncc>mcc 得到决策属性为healthy。

(6)、不满足以上条件的话如果mcc>ncc 得到决策属性为sick。

(7)、不满足以上条件的话得到决策属性为sick。

六、正确率及结果分析

正确率为82.5%

结果分析:由于采用了两类约束方法,所以效果还可以。

七、程序如下页所示

clear;

%%%%% 数据预处理程序%%%%%%

dm=xlsread('lisanhua'); % 载入数据%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% z1=dm(:,1); % 离散化第一列数据

for i=1:303

if z1(i)>=29&z1(i)<48

z1(i)=1;

elseif z1(i)>=48&z1(i)<62

z1(i)=2;

else z1(i)=3;

end

end

z2=dm(:,2);

for i=1:303

if z2(i)==0

z2(i)=1;

else z2(i)=2;

end

end

z3=dm(:,3);

for i=1:303

z3(i)=z3(i)+1;

end

z4=dm(:,4);

for i=1:303

if z4(i)>=94&z4(i)<110

z4(i)=1;

elseif z4(i)>=110&z4(i)<143

z4(i)=2;

else z4(i)=3;

end

end

z5=dm(:,5);

for i=1:303

if z5(i)>=126&z5(i)<205

z5(i)=1;

elseif z5(i)>=205&z5(i)<293

z5(i)=2;

else z5(i)=3;

end

end

z6=dm(:,6);

for i=1:303

z6(i)=z6(i)+1;

end

z7=dm(:,7);

for i=1:303

z7(i)=z7(i)+1;

end

z8=dm(:,8);

for i=1:303

if z8(i)>=71&z8(i)<120

z8(i)=1;

elseif z8(i)>=120&z8(i)<175

z8(i)=2;

else z8(i)=3;

end

end

z9=dm(:,9);

for i=1:303

z9(i)=z9(i)+1;

end

z10=dm(:,10);

for i=1:303

if z10(i)>=0&z10(i)<1.5

z10(i)=1;

elseif z10(i)>=1.5&z10(i)<2.5 z10(i)=2;

else z10(i)=3;

end

end

z11=dm(:,11);

for i=1:303

z11(i)=z11(i)+1;

end

z12=dm(:,12);

for i=1:303

z12(i)=z12(i)+1;

end

z13=dm(:,13);

for i=1:303

z13(i)=z13(i)+1;

end

z14=dm(:,14);

for i=1:303

z14(i)=z14(i)+1;

end

dm2=[z1,z2,z3,z4,z5,z6,z7,z8,z9,z10,z11,z12,z13,z14];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%

m1=[0,3,2,4,3,3,2,3,3,2,3,3,4,3];k=1;w=m1(k);dm3=dm2;

for i=1:3939

dm3(i)=dm2(i)+w;

if rem(i,303)==0

k=k+1;

w=w+m1(k);

end

end

%%%%% 预处理结束%%%%%%

%%%% 挖掘算法%%%%%%

%%%%%%%%%%%%%%%%%%%%%%% 找6条样本前的预处理dm4=zeros(200,14);dm5=zeros(200,14);

for i=1:200

if dm3(i,14)==1

dm4(i,1:13)=dm3(i,1:13);

else dm5(i,1:13)=dm3(i,1:13);

end

end

a1=zeros(38,1);a2=zeros(38,1);

for k=1:38

for i=1:13

for j=1:200

if dm4(j,i)==k&dm4(j,i)~=0

a1(k)=a1(k)+1;

end

if dm5(j,i)==k&dm5(j,i)~=0

a2(k)=a2(k)+1;

end

end

end

end

a5=a1;a6=a2;

a3=zeros(5,1);a4=zeros(5,1);

j=1;

while j<6

a11=0;

a11=max(a1);

for i=1:38

if a1(i)==a11

a3(j)=a11;

j=j+1;

if j>5

break;

end

a1(i)=0;

end

end

end

j=1;

while j<6

a22=0;

a22=max(a2);

for i=1:38

if a2(i)==a22

a4(j)=a22;

j=j+1;

if j>5

break;

end

a2(i)=0;

end

end

end

%%%%%%%%%%%%%%%% 构造h1 h2 矩阵

h1=zeros(200,14);

h2=zeros(1,200);

y1=0;y2=0;y3=0;y4=0;

for j=1:200

x=0;

for i=1:200

h1(i,1:13)=dm3(j,1:13)==dm3(i,1:13);

h1(i,14)=dm3(j,14)==dm3(i,14);

if sum(h1(i,1:13))>=10&h1(i,14)==1

x=x+1;

end

end

h2(j)=x;

end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%% 筛选h2 矩阵得到h3 h4矩阵h3=zeros(1,200);h4=zeros(1,200);

for i=1:200

if z14(i)==1

h3(i)=h2(i);

else h4(i)=h2(i);

end

end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% h5=h3;h6=h4;

%%%%%%%%%%%%%% 找六条重要样本%%%%%%%%% y1=max(h5);

for i=1:200

if h5(i)==y1

h5(i)=0;t1=i;

end

end

y2=max(h5);

for i=1:200

if h5(i)==y2

h5(i)=0;t2=i;

end

end

y3=max(h5);

for i=1:200

if h5(i)==y3

h5(i)=0;t3=i;

end

end

y4=max(h6);

for i=1:200

if h6(i)==y4

h6(i)=0;t4=i;

end

end

y5=max(h6);

for i=1:200

if h6(i)==y5

h6(i)=0;t5=i;

end

end

y6=max(h6);

for i=1:200

if h6(i)==y6

h6(i)=0;t6=i;

end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%% 找特殊样本结束

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 找特殊属性值

dm4=zeros(200,14);dm5=zeros(200,14);

for i=1:200

if dm3(i,14)==1

dm4(i,1:13)=dm3(i,1:13);

else dm5(i,1:13)=dm3(i,1:13);

end

end

a1=zeros(38,1);a2=zeros(38,1);

for k=1:38

for i=1:13

for j=1:200

if dm4(j,i)==k&dm4(j,i)~=0

a1(k)=a1(k)+1;

end

if dm5(j,i)==k&dm5(j,i)~=0

a2(k)=a2(k)+1;

end

end

end

end

a5=a1;a6=a2;

a3=zeros(6,1);a4=zeros(6,1); j=1;

while j<7

a11=0;

a11=max(a1);

for i=1:38

if a1(i)==a11

a3(j)=a11;

j=j+1;

if j>6

break;

end

a1(i)=0;

end

end

end

j=1;

while j<7

a22=0;

a22=max(a2);

for i=1:38

if a2(i)==a22

a4(j)=a22;

j=j+1;

if j>6

break;

end

a2(i)=0;

end

end

end

b1=zeros(6,1);b2=zeros(6,1);

for j=1:6

for i=1:38

if a5(i)==a3(j)

b1(j)=i;

end

end

end

for j=1:6

for i=1:38

if a6(i)==a4(j)

b2(j)=i;

end

end

end

b3(1:5,1)=b1(2:6,1);b4(1:5,1)=b2(1:5,1);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 寻找结束

%%%%%%%%%%%%%%%%%%%%% 验证程序开始

h7=zeros(103,14);h8=zeros(103,14);tc=0;

for i=1:103

h7(i,1:13)=dm3(200+i,1:13);

end

%%%%%%%%%%%%%%%%%%%%%%%%%% 特殊样本

for i=1:103

nc=0;mc=0;ncc=0;mcc=0;

h8(i,1:13)=h7(i,1:13)==dm3(t1,1:13);

if sum(h8(i,1:13))>=9

nc=nc+0.3;

end

h8(i,1:13)=h7(i,1:13)==dm3(t2,1:13);

if sum(h8(i,1:13))>=9

nc=nc+0.3;

end

h8(i,1:13)=h7(i,1:13)==dm3(t3,1:13);

if sum(h8(i,1:13))>=9

nc=nc+0.3;

end

h8(i,1:13)=h7(i,1:13)==dm3(t4,1:13);

if sum(h8(i,1:13))>=9

mc=mc+0.3;

end

h8(i,1:13)=h7(i,1:13)==dm3(t5,1:13);

if sum(h8(i,1:13))>=9

mc=mc+0.3;

end

h8(i,1:13)=h7(i,1:13)==dm3(t6,1:13);

if sum(h8(i,1:13))>=9

mc=mc+0.3;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 样本结束

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 特殊属性值

ncc=0;mcc=0;

for j=1:13

if h7(i,j)==b3(1)

ncc=ncc+3;

else if h7(i,j)==b3(2)

ncc=ncc+3;

else if h7(i,j)==b3(3)

ncc=ncc+2;

else if h7(i,j)==b3(4)

ncc=ncc+2;

else if h7(i,j)==b3(5)

ncc=ncc+2;

else if h7(i,j)==b4(1)

mcc=mcc+3;

else if h7(i,j)==b4(2)

mcc=mcc+3;

else if h7(i,j)==b4(3)

mcc=mcc+2;

else if h7(i,j)==b4(4)

mcc=mcc+2;

else if h7(i,j)==b4(5)

mcc=mcc+2;

end

end

end

end

end

end

end

end

end

end

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 属性值结束

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 挖掘算法

if (nc>=0.9&ncc>=8)|(ncc>=10&nc>=0.6)

h7(i,14)=1;

else if (mc>=0.9|mcc>=8)|(mcc>=9&mc>=0.6)

h7(i,14)=2;

else if nc>=(mc+0.3)|ncc>=(mcc+2)

h7(i,14)=1;

else if mc>nc

h7(i,14)=2;

else if ncc>mcc

h7(i,14)=1;

else if mcc>ncc

h7(i,14)=2;

else

h7(i,14)=2;

end

end

end

end

end

end

end %%%%%%%%%%%%%%%%%%%%%%%%% 挖掘结束%%%%%%%%%%%%%%%%%% 计算正确率

h9=zeros(103,1);

h9=h7(:,14)==dm3(201:303,14);

tc=sum(h9)/103 %%%%%%%%%%%%%%%%%%%%%%% 算法完毕

相关主题
文本预览
相关文档 最新文档