【嵌牛导读】关联规则挖掘算法是数据挖掘中的一种常用算法,用于发现隐藏在大型数据集中令人感兴趣的频繁出现的模式、关联和相关性。这里将对该算法进行简单的介绍,之后通过Apriori算法作为实例演示算法执行结果。
【嵌牛鼻子】数据挖掘 关联规则挖掘 python
【嵌牛正文】
一、算法原理
1、基本概念
关联规则用于发现隐藏在大型数据集中令人感兴趣的频繁出现的模式、关联和相关性。 而 Apriori算法则是经典的挖掘频繁项集的关联规则算法,它通过层层迭代来寻找频繁项集,最后输出关联规则:首先扫描数据集,得到 1-频繁项集,记为 L1,通过合并 L1得到 2-频繁项集 L2,再通过 L2找到 L3,如此层层迭代,直到找不到频繁项集为止。
在Apriori算法中,定义了如下几个概念:
⚫ 项与项集 :设 I={i1,i2,…,im}是由 m个不同项构成的集合,其中的每个 ik(k=1,2,…,m)被称为一个项 (Item),项的集合 I被称为项集和,即项集。在实验中,每一条购物记录可以被看做 一个项集,用户购买的某个商品即为一个项。
⚫ 事务与事务集:事务 T是项集 I的一个子集,而事务的全体被称为事务集。
⚫ 关联规则:形如 A=>B的表达式,其中, A和 B都属于项集 I,且 A与 B不相交。
⚫ 支持度:定义如下 support(A=>B) = P(A B),即 A和 B所含的项在事务集中同时出现的概率。
⚫ 置信度:定义如下 confidence(A⇒B)=support(A⇒B)/support(A)=P(A B)/P(A)=P(B|A),即如果事务包含 A,则事务中同时出现 B的概率。
⚫ 频繁项集:如果项集 I的支持度满足事先定义好的最小支持度阈值(即 I的出现频度大于相应的最小出现频度阈值),则 I是频繁项集。
⚫ 强关联规则:满足最小支持度和最小置信度的关联规则,即待挖掘的关联规则。
根据以上概念,要实现关联规则的挖掘,首先要找到所有的频繁项集,之后找出强关联规则(即通过多次扫描数据集,找出频繁集,然后产生关联规则)。
2、挖掘频繁项集
在该步骤中有两个较为重要的部分 :连接和修剪。连接步骤即使用k-1频繁项集,通过连接得到 k-候选项集,并且只有相差一个项的项集才能进行连接,如 {A,B}和 {B,C}连接成为 {A,B,C}。修剪步骤基于一个性质:一个 k-项集,如果它的一个 k-1项集(子集)不是频繁的,那么它本身也不可能是频繁的。 因此可以基于这个性质,通过判断先验性质来对候选集进行修剪。
3、产生关联规则
经过连接和修剪之后,即找到了所有的频繁项集,此时可以在此基础上产生关联规则,步骤如下
(1)对于每个频繁项集 l,产生 l的所有非空子集(这些非空子集一定是频繁项集);
(2)对于 l的每一个非空子集 x,计算 confidence(x =>(l-x)),如果 confidence(x =>(l-x)) confmin,那么规则 x =>(l-x)”成立。
二、算法设计
1、数据集
通过语句 import xlrd导入相关的库来进行数据的读取 。数据内容为十条购物记录 ,每条购物记录有若干个商品,表示某个顾客的购买记录 ,如图
对于数据加载部分 使用了 xlrd库中的函数 open_workbook来 打开一个表格文件,使用sheet_by_index函数得到一个工作表, row_values函数即可读取表格中的内容。由于每个购物记录的商品数不一定相同,导致读取的内容含有空格 (’ ’),因此对数据进行删减以得到紧凑的数据 ,最终读取数据的结果以列表的形式返回。
2、连接
对于连接部分,主要目标是根据已有的k-1频繁项集生成 k-候选频繁项集。算法步骤为:首先将项集中的项按照字典顺序排序,之后将 k-1项集中两个项作比较,如果两个项集中前 k-2个项是相同的,则可以通过或运算(|)将它们连接起来。
3、修剪
修剪 *** 作主要使用一个判断函数,通过传入连接 *** 作后的项集和之前的k-1频繁项集,对新的项集中的每一个项的补集进行判断,如果该补集不是 k-1频繁项集的子集,则证明新的项集不满足先验性质,即一个频繁项集的所有非空子集一定是频繁的 ,否则就满足先验形式。返回布尔类型的参数来供调用它的函数作判断。
经过连接和修剪步骤之后,项基要成为频繁项集还必须满足最小支持度的条件,笔者设计了generateFrequentItems函数来对连接、修剪后产生的 k-候选项集进行判断,通过遍历数据集,计算其支持度,满足最小支持度的项集即是 一个频繁项集,可将其返回。
以上,经过不断的遍历、连接、修剪、删除,可将得到的所有结果以列表形式返回。笔者还设计了字典类型的变量 support_data,以得到某个频繁项集及其支持度 。
4、挖掘关联规则
generateRules函数用来挖掘关联规则,通过传入 最小置信度、 频繁项集及其 支持度来生成规则 。根据定理:对于频繁项集 l的每一个非空子集 x,计算 confidence(x =>(l-x)),如果 confidence(x =>(l-x)) confmin,那么规则 x =>(l-x)”成立,因此,该函数重点在扫描频繁项集,得到每一个子集,并计算置信度,当置信度满足条件(即大于等于最小置信度)时,生成一条规则。在函数中,使用了元组来表示一条规则,元组中包含 x、 l-x以及其置信度 ,最后返回生成的所有规则的列表。
三、算法执行结果
设置最大频繁项集数k为 3,最小支持度为 0.2,最小置信度为 0.8 使用 pycharm运行程序 ,得到以下结果:
由图中结果可以看出,对于频繁 1-项集,有五个满足的项集,频繁 2-项集有 6个,频繁 3-项集有 2个,它们都满足支持度大于或等于最小支持度 0.2。根据频繁项集,程序得到的关联规则有三条,即 {面包 }=>{牛奶 },,{鸡蛋 }=>{牛奶 },,{面包,苹果 }=>{牛奶 其中,这些规则的置信度都是 1.0,满足大于或等于最小置信度 0.8的条件 。
四、程序源码
establish confidence树立信心
双语例句
1These are the minimum steps required to establish confidence in the transitionprocess.
这是就过渡进程建立起信心的最起码步骤。
2First, there is a need to establish confidence in the peace process.
第一,必须对和平进程充满信心。
3Establish confidence that a program does what it is supposed to do.
一个这样的定义:“就是建立一种信心,认为程序能够按预期的设想运行。
4To establish confidence, Iran must demonstrate the full transparency required.
为建立信任伊朗必须显示出所需的充分透明度。
5Messi: It will be a impressive game, scoring as early as possible to establishconfidence.
梅西:这将是一场令人印象深刻的较量,尽早进球可以树立信心。
function [b,bint,r,rint,stats] = regress(y,X,alpha)%REGRESS Multiple linear regression using least squares.
% B = REGRESS(Y,X) returns the vector B of regression coefficients in the
% linear model Y = X*B. X is an n-by-p design matrix, with rows
% corresponding to observations and columns to predictor variables. Y is
% an n-by-1 vector of response observations.
%
% [B,BINT] = REGRESS(Y,X) returns a matrix BINT of 95% confidence
% intervals for B.
%
% [B,BINT,R] = REGRESS(Y,X) returns a vector R of residuals.
%
% [B,BINT,R,RINT] = REGRESS(Y,X) returns a matrix RINT of intervals that
% can be used to diagnose outliers. If RINT(i,:) does not contain zero,
% then the i-th residual is larger than would be expected, at the 5%
% significance level. This is evidence that the I-th observation is an
% outlier.
%
% [B,BINT,R,RINT,STATS] = REGRESS(Y,X) returns a vector STATS containing
% the R-square statistic, the F statistic and p value for the full model,
% and an estimate of the error variance.
%
% [...] = REGRESS(Y,X,ALPHA) uses a 100*(1-ALPHA)% confidence level to
% compute BINT, and a (100*ALPHA)% significance level to compute RINT.
%
% X should include a column of ones so that the model contains a constant
% term. The F statistic and p value are computed under the assumption
% that the model contains a constant term, and they are not correct for
% models without a constant. The R-square value is the ratio of the
% regression sum of squares to the total sum of squares.
%
% If columns of X are linearly dependent, REGRESS sets the maximum
% possible number of elements of B to zero to obtain a "basic solution",
% and returns zeros in elements of BINT corresponding to the zero
% elements of B.
%
% REGRESS treats NaNs in X or Y as missing values, and removes them.
%
% See also LSCOV, POLYFIT, REGSTATS, ROBUSTFIT, STEPWISE.
% References:
% [1] Chatterjee, S. and A.S. Hadi (1986) "Influential Observations,
% High Leverage Points, and Outliers in Linear Regression",
% Statistical Science 1(3):379-416.
% [2] Draper N. and H. Smith (1981) Applied Regression Analysis, 2nd
% ed., Wiley.
% Copyright 1993-2004 The MathWorks, Inc.
% $Revision: 2.13.2.3 $ $Date: 2004/01/16 20:10:25 $
if nargin <2
error('stats:regress:TooFewInputs', ...
'REGRESS requires at least two input arguments.')
elseif nargin == 2
alpha = 0.05
end
% Check that matrix (X) and left hand side (y) have compatible dimensions
[n,ncolX] = size(X)
if ~isvector(y)
error('stats:regress:InvalidData', 'Y must be a vector.')
elseif numel(y) ~= n
error('stats:regress:InvalidData', ...
'The number of rows in Y must equal the number of rows in X.')
end
% Remove missing values, if any
wasnan = (isnan(y) | any(isnan(X),2))
havenans = any(wasnan)
if havenans
y(wasnan) = []
X(wasnan,:) = []
n = length(y)
end
% Use the rank-revealing QR to remove dependent columns of X.
[Q,R,perm] = qr(X,0)
p = sum(abs(diag(R)) >max(n,ncolX)*eps(abs(R(1))))
if p <ncolX
warning('stats:regress:RankDefDesignMat', ...
'X is rank deficient to within machine precision.')
R = R(1:p,1:p)
Q = Q(:,1:p)
perm = perm(1:p)
end
% Compute the LS coefficients, filling in zeros in elements corresponding
% to rows of X that were thrown out.
b = zeros(ncolX,1)
b(perm) = R \ (Q'*y)
if nargout >= 2
% Find a confidence interval for each component of x
% Draper and Smith, equation 2.6.15, page 94
RI = R\eye(p)
nu = max(0,n-p) % Residual degrees of freedom
yhat = X*b% Predicted responses at each data point.
r = y-yhat% Residuals.
if nu ~= 0
rmse = norm(r)/sqrt(nu) % Root mean square error.
tval = tinv((1-alpha/2),nu)
else
rmse = NaN
tval = 0
end
s2 = rmse^2 % Estimator of error variance.
se = zeros(ncolX,1)
se(perm,:) = rmse*sqrt(sum((RI .* RI)',1))'
bint = [b-tval*se, b+tval*se]
% Find the standard errors of the residuals.
% Get the diagonal elements of the "Hat" matrix.
% Calculate the variance estimate obtained by removing each case (i.e. sigmai)
% see Chatterjee and Hadi p. 380 equation 14.
if nargout >= 4
T = X(:,perm)*RI
hatdiag = sum(T .* T,2)
ok = ((1-hatdiag) >sqrt(eps(class(hatdiag))))
hatdiag(~ok) = 1
if nu >1
denom = (nu-1) .* (1-hatdiag)
sigmai = zeros(length(denom),1)
sigmai(ok) = sqrt(max(0,(nu*s2/(nu-1)) - (r(ok) .^2 ./ denom(ok))))
ser = sqrt(1-hatdiag) .* sigmai
ser(~ok) = Inf
elseif nu == 1
ser = sqrt(1-hatdiag) .* rmse
ser(~ok) = Inf
else % if nu == 0
ser = rmse*ones(length(y),1)% == Inf
end
% Create confidence intervals for residuals.
rint = [(r-tval*ser) (r+tval*ser)]
end
% Calculate R-squared and the other statistics.
if nargout == 5
% There are several ways to compute R^2, all equivalent when X has
% a constant term, but not equivalent when X doesn't. This version
% remains between 0 and 1 regardless.
RSS = norm(yhat-mean(y))^2 % Regression sum of squares.
TSS = norm(y-mean(y))^2% Total sum of squares.
r2 = RSS/TSS % R-square statistic.
if p >1
F = (RSS/(p-1))/s2 % F statistic for regression
else
F = NaN
end
prob = 1 - fcdf(F,p-1,nu) % Significance probability for regression
stats = [r2 F prob s2]
% All that requires a constant. Do we have one?
if ~any(all(X==1,1))
% Apparently not, but look for an implied constant.
b0 = R\(Q'*ones(n,1))
if (sum(abs(1-X(:,perm)*b0))>n*sqrt(eps(class(X))))
warning('stats:regress:NoConst',...
['R-square and the F statistic are not well-defined' ...
' unless X has a column of ones.\nType "help' ...
' regress" for more information.'])
end
end
end
% Restore NaN so inputs and outputs conform
if havenans
if nargout >= 3
tmp = repmat(NaN,length(wasnan),1)
tmp(~wasnan) = r
r = tmp
if nargout >= 4
tmp = repmat(NaN,length(wasnan),2)
tmp(~wasnan,:) = rint
rint = tmp
end
end
end
end % nargout >= 2
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)