apriori算法扫描数据库的最佳方案

卫青 2009-03-23 07:37:08
数据库为:



用这个的每一项去数据库查询出现的次数



查询结果



数据库为100W条记录,项为30左右,请问如何查询最有效率
...全文
609 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
ganaini 2009-03-24
  • 打赏
  • 举报
回复
感觉不错啊。
卫青 2009-03-24
  • 打赏
  • 举报
回复
谢谢诶。你的代码很管用
卫青 2009-03-23
  • 打赏
  • 举报
回复
恩 你早点休息 如果还没睡觉的话
你是怎么输出结果的啊??
htl258_Tony 2009-03-23
  • 打赏
  • 举报
回复
喝酒太困了,准备早点休息,老D他们刚来,他们看到会帮想的.
卫青 2009-03-23
  • 打赏
  • 举报
回复

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Par]
-- Add the parameters for the stored procedure here
@par varchar(1000)='enlish,chinese,math,political,physics,'
AS
BEGIN
declare @flag int,@start int,@end int,@i int;
set @flag=0;
set @start=0;
set @i=1;
while @flag=0
begin

set @end=charindex(',',@par,@start)

print substring(@par,@start,@end-@start);

set @start=@end +1
if @end=len(@par)
set @flag=1

set @i=@i+1

end


SET NOCOUNT ON;
END



这个是我写的截取字符串的过程
卫青 2009-03-23
  • 打赏
  • 举报
回复
这个得看我要计算的项,好像最多30位差不多吧
htl258_Tony 2009-03-23
  • 打赏
  • 举报
回复
项数最多会有多少?
卫青 2009-03-23
  • 打赏
  • 举报
回复
是,因为是apriori 算出来的项集,所以项集是增长的,
那你是怎么输出结果的?

我想吧计算结果输出到程序里面
htl258_Tony 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 Bulejava 的回复:]
如何我要在程序端 接收那些计算出来的支持度 我该怎么去接受,而且项的个数是不固定的
[/Quote]
程序就不熟了,关于个数不固定是怎么回事,如{I2,I3,I5}这样吗?
卫青 2009-03-23
  • 打赏
  • 举报
回复
如何我要在程序端 接收那些计算出来的支持度 我该怎么去接受,而且项的个数是不固定的
卫青 2009-03-23
  • 打赏
  • 举报
回复
谢谢啊 我得使命研读你写的,你不要走远啊,不知道还会遇到什么问题!
htl258_Tony 2009-03-23
  • 打赏
  • 举报
回复
create table AllElectronics(TID varchar(10),[List of item_ID's] varchar(500))
insert AllElectronics select 'T100','I1,I2,I5'
insert AllElectronics select 'T200','I2,I4'
insert AllElectronics select 'T300','I2,I3'
insert AllElectronics select 'T400','I1,I2,I4'
insert AllElectronics select 'T500','I1,I3'
insert AllElectronics select 'T600','II2,I4'
insert AllElectronics select 'T700','I1,I3'
insert AllElectronics select 'T800','I1,I22,I3,I5'
insert AllElectronics select 'T900','I1,I2,I3'
go
create table 项集(项集 varchar(10))
insert 项集 select '{I1,I2}'
insert 项集 select '{I1,I3}'
insert 项集 select '{I1,I4}'
insert 项集 select '{I1,I5}'
insert 项集 select '{I2,I3}'
insert 项集 select '{II2,I4}'
insert 项集 select '{I22,I5}'
insert 项集 select '{I3,I4}'
insert 项集 select '{I3,I5}'
insert 项集 select '{I4,I5}'

select
项集,
支持度计数=sum(case when charindex(substring(项集,2,charindex(',',项集)-2),[List of item_ID's])>0
and
charindex(substring(项集,charindex(',',项集)+1,len(项集)-1-charindex(',',项集)),[List of item_ID's])>0
then 1
else 0
end)
from AllElectronics a ,
项集 b
group by 项集
drop table AllElectronics,项集

/*
项集 支持度计数
---------- -----------
{I1,I2} 4
{I1,I3} 4
{I1,I4} 1
{I1,I5} 2
{I2,I3} 3
{I22,I5} 1
{I3,I4} 0
{I3,I5} 1
{I4,I5} 0
{II2,I4} 1

(10 行受影响)
*/
这样麻烦点,但兼容性强
卫青 2009-03-23
  • 打赏
  • 举报
回复
大哥啊 我有一件事 忘记和你说了
我的那个项 不是表,是在程序端 组合的项集。
还有 我不知道你那个脚本什么意思,怎么那么深奥啊
有QQ吗 拜访一下
htl258_Tony 2009-03-23
  • 打赏
  • 举报
回复
create table AllElectronics(TID varchar(10),[List of item_ID's] varchar(500))
insert AllElectronics select 'T100','I1,I2,I5'
insert AllElectronics select 'T200','I2,I4'
insert AllElectronics select 'T300','I2,I3'
insert AllElectronics select 'T400','I1,I2,I4'
insert AllElectronics select 'T500','I1,I3'
insert AllElectronics select 'T600','I2,I3'
insert AllElectronics select 'T700','I1,I3'
insert AllElectronics select 'T800','I1,I2,I3,I5'
insert AllElectronics select 'T900','I1,I2,I3'
go
create table 项集(项集 varchar(10))
insert 项集 select '{I1,I2}'
insert 项集 select '{I1,I3}'
insert 项集 select '{I1,I4}'
insert 项集 select '{I1,I5}'
insert 项集 select '{I2,I3}'
insert 项集 select '{I2,I4}'
insert 项集 select '{I2,I5}'
insert 项集 select '{I3,I4}'
insert 项集 select '{I3,I5}'
insert 项集 select '{I4,I5}'
select
项集,
支持度计数=sum(case when charindex(left(replace(replace(项集,'{',''),'}',''),2),[List of item_ID's])>0
and
charindex(right(replace(replace(项集,'{',''),'}',''),2),[List of item_ID's])>0
then 1
else 0
end)
from AllElectronics a ,
项集 b

group by 项集
/*
drop table AllElectronics,项集

项集 支持度计数
---------- -----------
{I1,I2} 4
{I1,I3} 4
{I1,I4} 1
{I1,I5} 2
{I2,I3} 4
{I2,I4} 2
{I2,I5} 2
{I3,I4} 0
{I3,I5} 1
{I4,I5} 0

(10 行受影响)
*/
这样好点
htl258_Tony 2009-03-23
  • 打赏
  • 举报
回复
提醒:注意不要误删除 AllElectronics,项集 这两个表.
卫青 2009-03-23
  • 打赏
  • 举报
回复
我晕 htl258 我激动中啊。。我先仔细看下你怎么做的 先回复一下 激动一下
卫青 2009-03-23
  • 打赏
  • 举报
回复
恩你的那种写法是可以,但是你是知道我有多少个参数的情况下,如果我增长到10维还有频繁项集呢

还有就是 你第一种方法似乎得哪每一个项 去扫描整个数据库,这样下来就很慢了
最好的是这样 扫描一次数据库,拿每条记录和频繁项集匹配 统计次数

改如何实现
htl258_Tony 2009-03-23
  • 打赏
  • 举报
回复
建表花了不少时间老兄,叫你贴数据你硬是不肯贴。
htl258_Tony 2009-03-23
  • 打赏
  • 举报
回复
create table AllElectronics(TID varchar(10),[List of item_ID's] varchar(500))
insert AllElectronics select 'T100','I1,I2,I5'
insert AllElectronics select 'T200','I2,I4'
insert AllElectronics select 'T300','I2,I3'
insert AllElectronics select 'T400','I1,I2,I4'
insert AllElectronics select 'T500','I1,I3'
insert AllElectronics select 'T600','I2,I3'
insert AllElectronics select 'T700','I1,I3'
insert AllElectronics select 'T800','I1,I2,I3,I5'
insert AllElectronics select 'T900','I1,I2,I3'
go
create table 项集(项集 varchar(10))
insert 项集 select '{I1,I2}'
insert 项集 select '{I1,I3}'
insert 项集 select '{I1,I4}'
insert 项集 select '{I1,I5}'
insert 项集 select '{I2,I3}'
insert 项集 select '{I2,I4}'
insert 项集 select '{I2,I5}'
insert 项集 select '{I3,I4}'
insert 项集 select '{I3,I5}'
insert 项集 select '{I4,I5}'
select
项集,
支持度计数=sum(case when charindex(left(replace(replace(项集,'{',','),'}',','),3),','+[List of item_ID's]+',')>0
and
charindex(right(replace(replace(项集,'{',','),'}',','),3),','+[List of item_ID's]+',')>0
then 1
else 0
end)
from AllElectronics a ,
项集 b
--where charindex(replace(replace(项集,'{',','),'}',','),','+[List of item_ID's]+',')>0
group by 项集
drop table AllElectronics,项集

项集 支持度计数
---------- -----------
{I1,I2} 4
{I1,I3} 4
{I1,I4} 1
{I1,I5} 2
{I2,I3} 4
{I2,I4} 2
{I2,I5} 2
{I3,I4} 0
{I3,I5} 1
{I4,I5} 0

(10 行受影响)
playwarcraft 2009-03-23
  • 打赏
  • 举报
回复
另1种方式,
定义
I1 : 2
I2 : 3
I3 : 5
I4 : 7
I5 : 11
...(素数)

不管哪几个数组合,其乘机是唯一的。

比如 I1,I3,I4 =2*5*7=70
所以,在项中,任意2个组合 I1,I3 和I1,I4和I3,I4 其积10,14,35都是可以被70整除的(也是素数两两组合唯一的)
只要求 两两乘积哪些可以被整除就可以统计了
加载更多回复(10)

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧