Apriori演算法Matlab實現

2021-07-10 18:02:35 字數 2986 閱讀 9804

clc;

clear;

%最小支援度設定

min_sup=2;

%最小置信度

min_conf=0.7;

%讀取檔案,當前的檔案型別是txt檔案,事務資料用數字來表示的,測試資料可以用《資料探勘概念與技術》第三版中的資料為樣本

fid=fopen('d:\matlabfile\apriori\dataapriori.txt','r');

%記錄讀取的行號,與實際的事務數相對應,同時為了分配儲存空間

numevent=1;

%新建事務資料集,由於各個事務的長短不一致,所以採用cell型別

dataset=cell(1,1);

%迴圈讀取檔案,按行讀取

while(~feof(fid))

lineinfo=fgetl(fid);

%將字元轉換為數字組成的陣列

c=str2num(lineinfo);

%空行,重新讀下一行

if (isempty(lineinfo))

continue; 

end 

%將一條(一行)事務資料新增到事務資料集中

dataset=c;

%行號加1

numevent=numevent+1;

end%將行號減1,上述的迴圈在結束時多加了1

numevent=numevent-1;

%結束檔案讀取,關閉檔案

fclose(fid);

%臨時事務資料集,用於運算操作

dataset_temp=dataset;

%%%第一次掃瞄dataset,統計每乙個候選項,並存在二維陣列中

%用來控制迴圈結束的標記

flag=1;

%統計每條事務中包含『項』的個數

count=1;

%儲存頻繁項

c_result=;

%儲存頻繁項,包含支援度計數,

c1_result=;

%儲存所有臨時的頻繁項

c=;while flag==1

%單項資料集,用來存放事務中包含的所有的單項,不包含其個數

c_temp=zeros(1,1);

%對所有單項進行統計,注意第一次迴圈與後面的迴圈用的陣列有所區別   

if count==1

%獲取臨時事務集中事務的個數

numevent=length(dataset_temp);

for i=1:numevent 

%獲得第i條事務中單項的個數

for j=1:length(dataset_temp)

%檢視第i條事務第j個單項是否已經存在於單項資料集中,如存在則繼續迴圈,否則增加新的單項

result=find(c_temp==dataset_temp(1,j));

%如果查詢的結果為空,則增加新的單項

if isempty(result)

c_temp=cat(1,c_temp,dataset_temp(1,j));

endend

endelse

numevent=size(c,1);

for i=1:numevent

%獲得第i條事務中單項的個數

for j=1:length(c(i,:))

%檢視第i條事務第j個單項是否已經存在於單項資料集中,如存在則繼續迴圈,否則增加新的單項

result=find(c_temp==c(i,j));

%如果查詢的結果為空,則增加新的單項

if isempty(result)

c_temp=cat(1,c_temp,c(i,j));

endend

endend

%刪除第一行空值,此時所有的單項都已經被統計出來

c_temp(1,:)=;

%對所有單項按照單項的個數進行組合

c=nchoosek(1:1:length(c_temp),count);

c1=c;

%建立乙個零值矩陣,

cc=zeros(size(c1,1),1);

%在c1矩陣的右側增加一列零值

c1=cat(2,c1,cc);

%將候選項與事務集進行比較,並統計個數

for i=1:size(c,1)

num=0;  

%獲得事務資料集中事務的個數

for j=1:length(dataset)

%設定迴圈結束標記

flag_1=1; 

for m=1:size(c,2)

a=num2str(c(i,m));  

%將事務資料集中的第j條事務轉變為字串

b=num2str(dataset);

b(find(isspace(b)))=;

%判斷字串a是否存在於字串b中

n=strfind(b,a);

if length(n)==0

flag_1=0;

break;

endend

if flag_1==1

num=num+1;

endend

c1(i,size(c1,2))=num;                                

end%把item數量小於支援度的項刪除

col=size(c1,2);

%尋找小於最小支援度的行號

result=find(c1(:,col)=min_conf                

%將組合的item放置在關聯規則結果中

association=c;

%將差值放入第二欄中

association=buf;

association=conf;

n_conf=n_conf+1;

endend                           

endend

1 2 5

2 42 3

1 2 4

1 32 3

1 31 2 3 5

1 2 3

matlab 實現基本apriori演算法

剛剛學了資料探勘的這個演算法,馬上實現下,怕忘掉了。感覺matlab的好處就是矩陣可以一起進行邏輯運算,不過我沒有進行預處理,輸入的資料集儲存在txt檔案裡,且都是以0 1矩陣構成的,不考慮出現次數。輸出只實現了得到k 頻繁項集,沒有計算最終的關聯規則。那個感覺要遍歷什麼的,用矩陣列舉?還沒想到怎麼...

Apriori演算法小結

1 apriori演算法是一種挖掘關聯規則的頻繁項集演算法,其核心思想是通過候選集生成挖掘頻繁項集。2 步驟 3 概念 對於a b 支援度 support p a b 既有a又有b 的概率 置信度 p b a p ab p a 在a 發生的事件中同時發生 b的概率 例如購物籃分析 牛奶 麵包例子 支...

Apriori演算法整理

首先兩個基本概念 支援度 a事件和b事件同時發生的概率 置信度 在a發生的事件中同時發生b的概率,p b a p ab p a 例子 支援度 3 置信度 40 支援度3 意味著 3 顧客同時購買牛奶和麵包 置信度40 意味著購買牛奶的顧客 40 也購買麵包 智慧型商場模型 目標是找到經常一起購買的物...