Matlab建立FP Tree Matlab樹結構

2021-10-02 04:11:01 字數 4038 閱讀 9382

本部落格的資料和要求是我的資料探勘課老師提供的,**是個人原創的。****vx:qczsbwjzjn,如果想要資料可以找我。另外安利一下matlab用於查詢函式用法的官網

給定2013,2014,2015,2016,2017的福彩雙色球資料,共767期資料

(1) 使用一種程式語言實現fp-tree的建樹演算法,並應用於此資料構建fp-tree;

(2) 統計所建fp-tree中的節點數目,包括根節點;

(3) 通過使用乙個演算法給出從根到葉子的節點數最多一條路徑,並顯示其中除根以外每個節點上的支援度計數;

(4) 給出關於根到葉子的節點一條路徑,且該路徑上所有節點的支援度計數之和最大,顯示每個節點上的支援度計數及總和。

示例:期號       紅球1    紅球2    紅球3    紅球4    紅球5    紅球6

2013001    6          8           14         15          24         25

2013002    1         16          18         22          28         30

2013003    22       23          26         27          28         33

2013004    6         10          16         20          27         32

用乙個1*n的cell來存放乙個節點的資訊

cell儲存當前節點所對應的球編號,cell儲存當前節點的支援度計數,cell(2如圖所示為根節點的節點資訊

main.m 主函式 

clear

%% 主程式

%% 讀取資料

ball=importdata('作業01-雙色球資料ssq2013_2017.txt');

ball=ball.data(:,2:end);%提取有效資料 得到767*6的矩陣

%% f=tabulate(ball(:));

f=sortrows(f,-2);%按支援度降序排列

%項頭表,第一列是球編號,第二列是支援度,第三列是佔總體的比例

%% 設定支援度閾值

max=f(1,2);%支援度最大值

threshold=max*0.8;%支援度閾值

d=f(f(:,2)<=threshold,1);%提取出支援度低於閾值的球編號至d

f(f(:,2)<=threshold,:)=;%刪去支援度低於閾值的球編號

order=f(:,1);%排列順序

for i=1:length(ball)

[~,index]=ismember(ball(i,:),order);

temp=[ball(i,:);index];

temp(:,temp(2,:)==0)=nan;

temp=sortrows(temp',2)';

ball(i,:)=temp(1,:);

end%% 初始化根節點

t=nan;

t=0;

%% 建立fp樹

for i=1:length(ball)

temp=ball(i,:);%temp為當第i行資料

temp=temp(~isnan(temp));%刪去nan

if ~isempty(temp)%temp不空,向t中插入temp

t=insertchild(t,temp,1);

endend%% 統計節點數目,包括根節點

node_number=nodenumber(t);

%% 統計節點最多的路徑,並記錄其每個節點的支援度

% 第一行為球的編號 第二行為編號對應的支援度

% 編號nan表示根節點

node_max=nodemax(t);

%% 節點支援度之和最大的路徑

node_support=supportmax(t);

insertchild.m 【遞迴】插入子樹 

function cell=insertchild(cell,num,k)

loc=ischild(cell,num(k));

if loc~=0%該元素是子樹

cell=cell+1;

if k~=length(num)

cell=insertchild(cell,num,k+1);

endelse %該元素非子樹

if k==length(num)

child=num(k);

child=1;

cell=child;

else

len=length(cell);

cell=num(k);

cell=1;

cell=insertchild(cell,num,k+1);

endend

end

ischild.m 判斷該節點是否是子樹,並返回位置

function loc=ischild(cell,num)

%loc表示該元素在cell中的位置

loc=0;

if length(cell)>2

for i=3:length(cell)

if isempty(cell)

break

elseif cell==num

loc=i;

break;

endend

endend

nodenumber.m檔案 【遞迴】尋找當前樹的葉子節點個數

function y=nodenumber(t)

len=length(t);

if len==2%當前節點為葉子節點

y=1;

else

y=1;

for i=3:len

y=y+nodenumber(t);

endend

end

nodemax.m函式  【遞迴】尋找節點數最多的路徑

function y=nodemax(t)

len=length(t);

if len==2%當前節點為葉子節點

y=[t;t];

else

k=[t;t];

max=1;

for i=3:len

temp=[k nodemax(t)];

if length(temp)>max

max=length(temp);

y=temp;

endend

endend

supportmax.m函式 【遞迴】尋找支援度最大的路徑

function y=supportmax(t)

len=length(t);

if len==2%當前節點為葉子節點

y=[t;t];

else

k=[t;t];

max=0;

for i=3:len

temp=[k supportmax(t)];

if sum(temp(2,:))>max

max=sum(temp(2,:));

y=temp;

endend

endend

demo 簡短的方便檢視結果的樣例** 

ball=[2 7 5;

3 6 1;

7 5 3;

6 2 3;

7 4 5];

threshold=2;%支援度閾值

f=tabulate(ball(:)); %編號 支援度

f=sortrows(f,-2); % 3 3

d=f(f(:,2)

Matlab陣列建立

只用c語言,不用matlab這種魔咒還是要打破的。matlab是科學計算的常用工具,既然以前沒用過,現在開始學吧.1 向量的建立 1 直接輸入 行向量 a 1,2,3,4,5 列向量 a 1 2 3 4 5 2 用 生成向量 a j k 生成的行向量是a j,j 1,k a j d k 生成行向量a...

matlab矩陣建立

matlab矩陣的建立 1.矩陣的建立方法 2.特殊矩陣的建立 2.1 空矩陣 m 2.2 單位矩陣 eye m,n 生成mn的矩陣 eye size m 建立乙個與m矩陣維度相同的單位陣。2.3 全1矩陣 ones 3,5 生成乙個35的矩陣 2.4 全零矩陣 zeros m,n mn的矩陣 2....

matlab陣列的建立

原文 1 直接輸入 行向量 a 1,2,3,4,5 列向量 a 1 2 3 4 5 2 用 生成向量 a j k 生成的行向量是a j,j 1,k a j d k 生成行向量a j,j d,j m d m fix k j d 3 函式linspace 用來生成資料按等差形式排列的行向量 x lins...