本部落格的資料和要求是我的資料探勘課老師提供的,**是個人原創的。****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...