Apriori算法第二篇----详细分析和代码实现

Apriori算法详解及手写案例 大家好,我是W 在数据挖掘中有一种关联分析算法叫做Apriori算法,大家可能都听说过啤酒尿布的故事,购买尿布的爸爸很可能会再去购买一份啤酒来犒劳自己,在大数据的背景下已经无法使用人工的方法去发现海量商品间的关联性,所以需要算法的支持。Apriori就是关联性分析算法的祖师级算法。接下来我们从下面几个内容来讲Apriori算法:1、相関概念 2、算法原理 3、Apriori算法实现 - 7500行购物清单案例 4、算法优劣分析。 1、 相关概念 在学习算法前需要了解一些特定名词,以及一些评估频繁项集的几个指 阅读详情

1 Apriori介绍

Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然后利用L1找频繁2项集的集合L2,L2找L3,如此下去,直到不能再找到任何频繁k项集。最后再在所有的频繁集中找出强规则,即产生用户感兴趣的关联规则。

其中,Apriori算法具有这样一条性质:任一频繁项集的所有非空子集也必须是频繁的。因为假如P(I)< 最小支持度阈值,当有元素A添加到I中时,结果项集(A∩I)不可能比I出现次数更多。因此A∩I也不是频繁的。

2   连接步和剪枝步

在上述的关联规则挖掘过程的两个步骤中,第一步往往是总体性能的瓶颈。Apriori算法采用连接步和剪枝步两种方式来找出所有的频繁项集。

1)  连接步

为找出Lk(所有的频繁k项集的集合),通过将Lk-1(所有的频繁k-1项集的集合)与自身连接产生候选k项集的集合。候选集合记作Ck。设l1和l2是Lk-1中的成员。记li[j]表示li中的第j项。假设Apriori算法对事务或项集中的项按字典次序排序,即对于(k-1)项集li,li[1]<li[2]<……….<li[k-1]。将Lk-1与自身连接,如果(l1[1]=l2[1])&&( l1[2]=l2[2])&&……..&& (l1[k-2]=l2[k-2])&&(l1[k-1]<l2[k-1]),那认为l1和l2是可连接。连接l1和l2 产生的结果是{l1[1],l1[2],……,l1[k-1],l2[k-1]}。

2)  剪枝步

CK是LK的超集,也就是说,CK的成员可能是也可能不是频繁的。通过扫描所有的事务(交易),确定CK中每个候选的计数,判断是否小于最小支持度计数,如果不是,则认为该候选是频繁的。为了压缩Ck,可以利用Apriori性质:任一频繁项集的所有非空子集也必须是频繁的,反之,如果某个候选的非空子集不是频繁的,那么该候选肯定不是频繁的,从而可以将其从CK中删除。

(Tip:为什么要压缩CK呢?因为实际情况下事务记录往往是保存在外存储上,比如数据库或者其他格式的文件上,在每次计算候选计数时都需要将候选与所有事务进行比对,众所周知,访问外存的效率往往都比较低,因此Apriori加入了所谓的剪枝步,事先对候选集进行过滤,以减少访问外存的次数。)

3   Apriori算法实例

交易ID

商品ID列表

T100

I1,I2,I5

T200

I2,I4

T300

I2,I3

T400

I1,I2,I4

T500

I1,I3

T600

I2,I3

T700

I1,I3

T800

I1,I2,I3,I5

T900

I1,I2,I3

上图为某商场的交易记录,共有9个事务,利用Apriori算法寻找所有的频繁项集的过程如下:


详细介绍下候选3项集的集合C3的产生过程:从连接步,首先C3={{I1,I2,I3},{I1,I2,I5},{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}}(C3是由L2与自身连接产生)。根据Apriori性质,频繁项集的所有子集也必须频繁的,可以确定有4个候选集{I1,I3,I5},{I2,I3,I4},{I2,I3,I5},{I2,I4,I5}}不可能时频繁的,因为它们存在子集不属于频繁集,因此将它们从C3中删除。注意,由于Apriori算法使用逐层搜索技术,给定候选k项集后,只需检查它们的(k-1)个子集是否频繁。

3. Apriori伪代码

算法:Apriori

输入:D - 事务数据库;min_sup - 最小支持度计数阈值

输出:L - D中的频繁项集

方法:

     L1=find_frequent_1-itemsets(D); // 找出所有频繁1项集

     For(k=2;Lk-1!=null;k++){

        Ck=apriori_gen(Lk-1); // 产生候选,并剪枝

        For each 事务t in D{ // 扫描D进行候选计数

            Ct =subset(Ck,t); // 得到t的子集

            For each 候选c 属于 Ct

                         c.count++;

        }

        Lk={c属于Ck | c.count>=min_sup}

}

Return L=所有的频繁集;

 

Procedure apriori_gen(Lk-1:frequent(k-1)-itemsets)

      For each项集l1属于Lk-1

              For each项集 l2属于Lk-1

                       If((l1[1]=l2[1])&&( l1[2]=l2[2])&&……..

&& (l1[k-2]=l2[k-2])&&(l1[k-1]<l2[k-1])) then{

                   c=l1连接l2 //连接步:产生候选

                   if has_infrequent_subset(c,Lk-1) then

                       delete c; //剪枝步:删除非频繁候选

                   else add c to Ck;

                  }

          Return Ck;

 

     Procedure has_infrequent_sub(c:candidate k-itemset; Lk-1:frequent(k-1)-itemsets)

        For each(k-1)-subset s of c

            If s不属于Lk-1 then

               Return true;

        Return false;

 

 

 

4. 由频繁项集产生关联规则

Confidence(A->B)=P(B|A)=support_count(AB)/support_count(A)

关联规则产生步骤如下:

1)  对于每个频繁项集l,产生其所有非空真子集;

2)  对于每个非空真子集s,如果support_count(l)/support_count(s)>=min_conf,则输出 s->(l-s),其中,min_conf是最小置信度阈值。

例如,在上述例子中,针对频繁集{I1,I2,I5}。可以产生哪些关联规则?该频繁集的非空真子集有{I1,I2},{I1,I5},{I2,I5},{I1 },{I2}和{I5},对应置信度如下:

I1&&I2->I5            confidence=2/4=50%

I1&&I5->I2            confidence=2/2=100%

I2&&I5->I1            confidence=2/2=100%

I1 ->I2&&I5            confidence=2/6=33%

I2 ->I1&&I5            confidence=2/7=29%

I5 ->I1&&I2            confidence=2/2=100%

如果min_conf=70%,则强规则有I1&&I5->I2,I2&&I5->I1,I5 ->I1&&I2。

5. Apriori Java代码

package com.apriori;

 

import java.util.ArrayList;

import java.util.Collections;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Set;

 

public class Apriori {

 

         private final static int SUPPORT = 2; // 支持度阈值

         private final static double CONFIDENCE = 0.7; // 置信度阈值

 

         private final static String ITEM_SPLIT=";"; // 项之间的分隔符

         private final static String CON="->"; // 项之间的分隔符

 

         private final static List<String> transList=new ArrayList<String>(); //所有交易

 

         static{//初始化交易记录

                   transList.add("1;2;5;");

                   transList.add("2;4;");

                   transList.add("2;3;");

                   transList.add("1;2;4;");

                   transList.add("1;3;");

                   transList.add("2;3;");

                   transList.add("1;3;");

                   transList.add("1;2;3;5;");

                   transList.add("1;2;3;");

         }

 

        

         public Map<String,Integer> getFC(){

        Map<String,Integer> frequentCollectionMap=new HashMap<String,Integer>();//所有的频繁集

 

        frequentCollectionMap.putAll(getItem1FC());

 

        Map<String,Integer> itemkFcMap=new HashMap<String,Integer>();

        itemkFcMap.putAll(getItem1FC());

        while(itemkFcMap!=null&&itemkFcMap.size()!=0){

          Map<String,Integer> candidateCollection=getCandidateCollection(itemkFcMap);

          Set<String> ccKeySet=candidateCollection.keySet();

 

          //对候选集项进行累加计数

          for(String trans:transList){

             for(String candidate:ccKeySet){

                      boolean flag=true;// 用来判断交易中是否出现该候选项,如果出现,计数加1

                      String[] candidateItems=candidate.split(ITEM_SPLIT);

                      for(String candidateItem:candidateItems){

                               if(trans.indexOf(candidateItem+ITEM_SPLIT)==-1){

                                         flag=false;

                                         break;

                               }

                      }

                      if(flag){

                               Integer count=candidateCollection.get(candidate);

                               candidateCollection.put(candidate, count+1);

                      }

             }

          }

 

          //从候选集中找到符合支持度的频繁集项

          itemkFcMap.clear();

          for(String candidate:ccKeySet){

             Integer count=candidateCollection.get(candidate);

             if(count>=SUPPORT){

                 itemkFcMap.put(candidate, count);

             }

          }

 

          //合并所有频繁集

          frequentCollectionMap.putAll(itemkFcMap);

 

        }

 

        return frequentCollectionMap;

         }

 

        

         private Map<String,Integer> getCandidateCollection(Map<String,Integer> itemkFcMap){

                   Map<String,Integer> candidateCollection=new HashMap<String,Integer>();

                   Set<String> itemkSet1=itemkFcMap.keySet();

                   Set<String> itemkSet2=itemkFcMap.keySet();

 

                   for(String itemk1:itemkSet1){

                            for(String itemk2:itemkSet2){

                                     //进行连接

                                     String[] tmp1=itemk1.split(ITEM_SPLIT);

                                     String[] tmp2=itemk2.split(ITEM_SPLIT);

 

                                     String c="";

                                     if(tmp1.length==1){

                                               if(tmp1[0].compareTo(tmp2[0])<0){

                                                        c=tmp1[0]+ITEM_SPLIT+tmp2[0]+ITEM_SPLIT;

                                               }

                                     }else{

                                               boolean flag=true;

                    for(int i=0;i<tmp1.length-1;i++){

                           if(!tmp1[i].equals(tmp2[i])){

                                    flag=false;

                                    break;

                           }

                    }

                    if(flag&&(tmp1[tmp1.length-1].compareTo(tmp2[tmp2.length-1])<0)){

                           c=itemk1+tmp2[tmp2.length-1]+ITEM_SPLIT;

                    }

                                     }

 

                                     //进行剪枝

                                     boolean hasInfrequentSubSet = false;

                                     if (!c.equals("")) {

                                               String[] tmpC = c.split(ITEM_SPLIT);

                                               for (int i = 0; i < tmpC.length; i++) {

                                                        String subC = "";

                                                        for (int j = 0; j < tmpC.length; j++) {

                                                                 if (i != j) {

                                                                           subC = subC+tmpC[j]+ITEM_SPLIT;

                                                                 }

                                                        }

                                                        if (itemkFcMap.get(subC) == null) {

                                                                 hasInfrequentSubSet = true;

                                                                 break;

                                                        }

                                               }

                                     }else{

                                               hasInfrequentSubSet=true;

                                     }

 

                                     if(!hasInfrequentSubSet){

                                               candidateCollection.put(c, 0);

                                     }

                            }

                   }

 

                   return candidateCollection;

         }

 

        

         private Map<String,Integer> getItem1FC(){

                   Map<String,Integer> sItem1FcMap=new HashMap<String,Integer>();

                   Map<String,Integer> rItem1FcMap=new HashMap<String,Integer>();//频繁1项集

 

                   for(String trans:transList){

                            String[] items=trans.split(ITEM_SPLIT);

                            for(String item:items){

                                     Integer count=sItem1FcMap.get(item+ITEM_SPLIT);

                                     if(count==null){

                                               sItem1FcMap.put(item+ITEM_SPLIT, 1);

                                     }else{

                                               sItem1FcMap.put(item+ITEM_SPLIT, count+1);

                                     }

                            }

                   }

 

                   Set<String> keySet=sItem1FcMap.keySet();

                   for(String key:keySet){

                            Integer count=sItem1FcMap.get(key);

                            if(count>=SUPPORT){

                                     rItem1FcMap.put(key, count);

                            }

                   }

                   return rItem1FcMap;

         }

 

   

         public Map<String,Double> getRelationRules(Map<String,Integer> frequentCollectionMap){

                   Map<String,Double> relationRules=new HashMap<String,Double>();

                   Set<String> keySet=frequentCollectionMap.keySet();

                   for (String key : keySet) {

                            double countAll=frequentCollectionMap.get(key);

                            String[] keyItems = key.split(ITEM_SPLIT);

                            if(keyItems.length>1){

                                     List<String> source=new ArrayList<String>();

                                     Collections.addAll(source, keyItems);

                                     List<List<String>> result=new ArrayList<List<String>>();

 

                                     buildSubSet(source,result);//获得source的所有非空子集

 

                                     for(List<String> itemList:result){

                    if(itemList.size()<source.size()){//只处理真子集

                           List<String> otherList=new ArrayList<String>();

                           for(String sourceItem:source){

                                    if(!itemList.contains(sourceItem)){

                                             otherList.add(sourceItem);

                                    }

                           }

                        String reasonStr="";//前置

                        String resultStr="";//结果

                        for(String item:itemList){

                                reasonStr=reasonStr+item+ITEM_SPLIT;

                        }

                        for(String item:otherList){

                                resultStr=resultStr+item+ITEM_SPLIT;

                        }

 

                        double countReason=frequentCollectionMap.get(reasonStr);

                        double itemConfidence=countAll/countReason;//计算置信度

                        if(itemConfidence>=CONFIDENCE){

                                String rule=reasonStr+CON+resultStr;

                                relationRules.put(rule, itemConfidence);

                        }

                    }

                                     }

                            }

                   }

 

                   return relationRules;

         }

 

        

         private  void buildSubSet(List<String> sourceSet, List<List<String>> result) {

                   // 仅有一个元素时,递归终止。此时非空子集仅为其自身,所以直接添加到result中

                   if (sourceSet.size() == 1) {

                            List<String> set = new ArrayList<String>();

                            set.add(sourceSet.get(0));

                            result.add(set);

                   } else if (sourceSet.size() > 1) {

                            // 当有n个元素时,递归求出前n-1个子集,在于result中

                            buildSubSet(sourceSet.subList(0, sourceSet.size() - 1), result);

                            int size = result.size();// 求出此时result的长度,用于后面的追加第n个元素时计数

                            // 把第n个元素加入到集合中

                            List<String> single = new ArrayList<String>();

                            single.add(sourceSet.get(sourceSet.size() - 1));

                            result.add(single);

                            // 在保留前面的n-1子集的情况下,把第n个元素分别加到前n个子集中,并把新的集加入到result中;

                            // 为保留原有n-1的子集,所以需要先对其进行复制

                            List<String> clone;

                            for (int i = 0; i < size; i++) {

                                     clone = new ArrayList<String>();

                                     for (String str : result.get(i)) {

                                               clone.add(str);

                                     }

                                     clone.add(sourceSet.get(sourceSet.size() - 1));

 

                                     result.add(clone);

                            }

                   }

         }

 

         public static void main(String[] args){

                   Apriori apriori=new Apriori();

                   Map<String,Integer> frequentCollectionMap=apriori.getFC();

                   System.out.println("----------------频繁集"+"----------------");

                   Set<String> fcKeySet=frequentCollectionMap.keySet();

                   for(String fcKey:fcKeySet){

                            System.out.println(fcKey+"  :  "+frequentCollectionMap.get(fcKey));

                   }

        Map<String,Double> relationRulesMap=apriori.getRelationRules(frequentCollectionMap);

        System.out.println("----------------关联规则"+"----------------");

        Set<String> rrKeySet=relationRulesMap.keySet();

        for(String rrKey:rrKeySet){

                            System.out.println(rrKey+"  :  "+relationRulesMap.get(rrKey));

                   }

         }

}


转载自:http://blog.youkuaiyun.com/zjd950131/article/details/8071414

更多 2

R语言 | 关联规则 关联规则(AssociationRules)是无监督的机器学习方法,用于知识发现,而非预测。 关联规则的学习器(learner)无需事先对训练数据进行打标签,因为无监督学习没有训练这个步骤。缺点是很难对关联规则学习器进行模型评估,一般都可以通过肉眼观测结果是否合理。 关联规则主要用来发现Pattern,最经典的应用是购物篮分析,当然其他类似于购物篮交易数据的案例也可以应用关联规则进行模式发现。 阅读详情

相关推荐

用python实现Apriori算法

用python实现Apriori算法 Apriori算法是一种关联规则挖掘算法,用来找频繁项集和关联规则,Apriori算法利用了频繁项集的子集也一定是频繁的这一思想,例如,如果{A,B} 是频繁项集,则 {A}和{B} 也一定是频繁项集 从1到k(k项集)递归查找频繁项集,再用得到的频繁项集生成关联规则 例题 在这里,我用如下一题进行讲述: 提取以下购物篮数据中的频繁项集和强关联规则(参数设置:...

weixin_43699672的博客 4477

Apriori算法例题

数据挖掘Apriori算法例题,频繁项目集,最大频繁项目集,超集,强关联,生成关联准则

m0_46400910的博客 2万+

Apriori算法详解与实现

一、摘要   本文讲解Apriori算法的原理,梳理了Apriori算法的实现流程,并使用Java实现Apriori算法,通过Java自身集合操作和缓存等操作减少算法的扫描次数,使Apriori算法具有较高的性能。 二、绪论   随着社会经济和购买力的不断发展,商场也面临着急剧膨胀的购买记录,如何通过研究购买记录来获取购买规律来提高收益也便成为了研究热点。沃尔玛发现,当一个人购买尿布,那么他便有很高的几率购买啤酒,这就是著名的“啤酒与尿布”的故事。研究“啤酒与尿布”关联的方法就是购物篮分析,购物篮分析曾经是

qq_44753451的博客 1万+

Apriori算法详细和例题演示

根据用户给定的最小支持度min_sup ,寻找出所有的频繁项集,即满足支持度Support不低于min_ sup的所有项集。由于这些频繁项集之间有可能存在包含关系,因此,我们可以只关心所有的最大频繁项集,即那些不被其它频繁项集所包含的所有频繁项集...

qq_55433305的博客 8675

Java实现Apriori算法

简介: Apriori算法是第一个关联规则挖掘算法,也是最经典的算法。它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与剪枝(去掉那些没必要的中间结果)组成。该算法中项集的概念即为项的集合。包含K个项的集合为k项集。项集出现的频率是包含项集的事务数,称为项集的频率。如果某项集满足最小支持度,则称它为频繁项集。 基本思想: 首先扫描数据库中所需要进行分析的数据,在设置完支持度以及置信度以后,在最小支持度的支持下产生频繁项,即统计所有项目集中包含一个或一个以上的元素频数,找

weixin_45685353的博客 5527

Apriori算法介绍及实现代码

引言:什么是数据挖掘          随着大数据时代的到来我们生活中的方方面面都受到了数据挖掘的影响,比如你在淘宝上买了一件商品,当你下次登录的时候在淘宝的界面上会出现各种与你曾经购物信息相关的商品。或者当你用网易云音乐听音乐的时候你从推荐歌单中选择了你喜欢的音乐、删除了你不喜欢的音乐,通过你这次的选择的音乐相关性网易音乐会在下次推荐歌单时对音乐类型进行调整。所以,基于数据挖掘的机器学习方案有...

qq_38375282的博客 1万+

apriori2 java_Apriori算法第二篇----详细分析和代码实现

1 Apriori介绍Apriori算法使用频繁项集的先验知识,使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集。首先,通过扫描事务(交易)记录,找出所有的频繁1项集,该集合记做L1,然后利用L1找频繁2项集的集合L2,L2找L3,如此下去,直到不能再找到任何频繁k项集。最后再在所有的频繁集中找出强规则,即产生用户感兴趣的关联规则。其中,Apriori算法具有这样一条性质:任一频繁项集...

weixin_42364551的博客 399

关联规则算法——Apriori算法解析及Python实现

文章目录关联规则挖掘过程Apriori算法1. Apriori算法的基本思想2. Apriori算法产生频繁项集的过程3. Apriori算法的主要步骤4. 举例及代码实现 关联规则挖掘过程 关联规则挖掘问题可以分解为以下两个子问题 找频繁项集 找出事务集T中所有大于或等于用户指定最小支持度的项集,即频繁项集。(项集的支持度可简单用包含该项集的事务数来表示) 利用频繁项集生成所需要的关联规则 对每一频繁项集A,找到A的所有非空子集a,如果support(A) / support(a) >= min

bibibibiboi的博客 4824

利用 Python 实现简单的 Apriori 算法

利用 Python 实现简单的 Apriori 算法   实现Apriori算法,并采用所写程序提取以下购物篮数据中的频繁项集和强关联规则(参数设置:最小支持度计数 = 4,最小置信度 = 0.6) 事务ID 购买商品 001 面包,黄油,尿布,啤酒 002 咖啡,糖,小甜饼,鲑鱼,啤酒 003 面包,黄油,咖啡,尿布,啤酒,鸡蛋 004 面包,黄油,鲑鱼,鸡 00...

渣渣的夏天 1万+

Apriori算法及C++实现

最近工作比较忙,每天发在学习上的时间比较少,最近学的数据挖掘教程比较进度缓慢,上星期开始看的Apriori算法,这算是我接触的第一个数据挖掘方面的算法,看了2-3遍了解其原理。曾看过大侠说过,要想完全理解其算法的本质,即必须上机编写测试,哪怕是写出伪代码也要翻译成机器语言跑一遍,来感觉此算法的伟大。所以抽了个周六,详细编写了遍,并参考网上的例子,对其进行适当的优化。 首先我们要先了解Aprior

shadow_dreamer的博客 1万+

Apriori算法原理及实现

有这样一个故事:美国的妇女们经常会嘱咐她们的丈夫下班后为孩子买尿布,而丈夫在买完尿布后又要顺 手买回自己爱喝的啤酒,因此啤酒和尿布在一起被购买的机会很多。这个举措使尿布和啤酒的销量双双增加,并一直为众商家所津津乐道。"尿布和啤酒":关联规则的一个非常有名的故事。关联规则的是在一个数据集中找出项与项之间的关系,也被称为购物蓝分析。

晓风残月xj 7504

【手撕算法】【Apriori】关联规则Apriori原理、代码实现

文章目录1.前言2.简介3.原理3.0.示例3.1.概念介绍3.2.Apriori原理3.3.优点3.4.缺点3.5.算法步骤4.代码实现4.1懒人必备,开箱速食4.2.代码详解5.总结6.参考资料 1.前言 ⭐️ 开箱即食,直接复制,懒人传送门:4.1懒人必备,开箱速食 ⭐️ 本文主要从原理、代码实现 理论和实战两个角度来剖析Apriori算法 ⭐️ 理论部分主要是关于 什么是 频繁项集、支持度、置信度 ⭐️ 实战部分主要是根据原理 去复现代码 并在简单的数据集上验证结果,对应的本文代码链接为:Aprio

weixin_42279212的博客 2万+

Apriori算法——深度剖析及源码实现

引言在一家超市中,人们发现了一个特别有趣的现象:尿布与啤酒这两种风马牛不相及的商品居然摆在一起。但这一奇怪的举措却使尿布和啤酒的稍量大幅增加了。这可不是一个笑话,而是一直被商家所津津乐道的发生在美国沃尔玛连锁超市的真实案例。原来,美国的妇女通常在家照顾孩子,所以她们经常会嘱咐丈夫在下班回家的路上为孩子买尿布,而丈夫在买尿布的同时又会顺手购买自己爱喝的啤酒。这个发现为商家带来了大量的利润,但是如何从浩

老杨的博客 7771

大白话解析Apriori算法python实现(含源代码详解)

前言:Apriori算法是关联规则挖掘算法,也是最经典的算法。 它是为了发现事物之间的联系的算法,比如我们熟知的啤酒与尿布故事,某超市在对顾客购物习惯分析时,发现,男性顾客在购买婴儿尿片时,常常会顺便搭配几瓶啤酒来犒劳自己,于是尝试推出了将啤酒和尿布摆在一起的促销手段,最后使得啤酒与尿布销量双双提升。 我们的Aprioir算法就是为了发现这样的关联,而产生的,在文章中我会尽量用通俗的语言,讲解这个...

A little storm的博客 8万+

【硬件自锁开关】用两个D触发器完成实用的自锁开关电路

性价比是做电子设计的人要考虑的事,在学会了用单片机解决大多数问题的时候,是否你也想过用简单的手段解决一个多数场合要解决的问题呢?按一下,输出状态由关闭变成开启,再按一下开启变成关闭。机械弹簧式的开关可以实现自锁的功能:钩子和弹簧将当前状态“储存”起来,这个能量为下一次触发的提供状态“翻转”的动力;在电子设计中,经常通过单片机的程序指令实现自锁:通过寄存器将当前电平状态暂存起来,下一次触发的时候寄存器内容“取反”,再将其输出到端口。可否用电路实现以上过程呢?完全可以,方案很简单,通过两个D触发器即可实现。

qq_33175704的博客 4253

BCIC IV 2a数据集:从下载到实战应用全解析

本文全面解析了BCI Competition IV 2a(BCIC IV 2a)数据集的应用流程。从官方渠道下载数据、解析其结构,到在MATLAB和Python环境中进行数据导入、预处理(包括处理特殊受试者A04T),并详细演示了从特征提取(如CSP)到分类(如LDA、SVM)的完整实战步骤,为脑机接口研究者提供了从入门到实践的清晰指南。

weixin_28235513的博客 972

python实现Apriori算法

★ 关联分析: 从大规模数据集中寻找物品间的隐含关系被称作关联分析。而寻找物品的不同组合是一项十分耗时的任务,所需的计算代价很高。Apriori算法正是来解决这一问题。 物品之间的关系一般可以有两种形式:频繁项集和关联规则。 频繁项集:数据集中经常出现在一块的物品的集合。 关联规则:两种物品之间可能存在很强的关系。 ...

weixin_42051109的博客 4万+

Pipeline更多理解

Pipe 类型用途VIGVideo Image Generator:用于图层显示,支持 scaling、rotationRGB简单图层显示,较低优先级DMA主要用于 writeback / WFD / composition output,即从 framebuffer 输出到外部设备(或 memory)Cursor小图层,用于显示指针等很可能是:分别用于主屏、仪表、虚拟显示的输出路径或者用于不同的 display 去做 GPU_TARGET / writeback 的拷贝你看到的意思。

Damon_X的博客 1052

Apriori算法的python实现

最近学习了关联分析和用于寻找频繁项集的Apriori算法,做了一些笔记,并且来自己实现一下。

jkjgj的博客 5617

CyberChef本地搭建

CyberChef本地搭建

2301_80241182的博客 6069

windows10系统上安装最新版mysql 8.0详细步骤

windows10系统上安装最新版mysql 8.0详细步骤

glei20的博客 6715

Apriori 算法原理以及python实现详解

Apriori 算法原理以及python实现 ​ Apriori算法是第一个关联规则挖掘算法,也是最经典的算法。它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过 程由连接(类矩阵运算)与剪枝(去掉那些没必要的中间结果)组成。该算法中项集的概念即为项的集合。包含K个项的集合为k项集。项 集出现的频率是包含项集的事务数,称为项集的频率。如果某项集满足最小支持度,则称它为频繁项集。(节选自百科) 1. Apriori 算法原理介绍 ​ 设想场景如下:有一商场,记录对比每位顾客每次购买商品的清单,会

JinBoH的博客 1万+

基于Xilinx K7-410T的高速DAC之AD9129开发笔记(一)

引言:从本文开始,我们介绍下项目中设计的并行LVDS高速DAC接口设计,包括DAC与FPGA硬件接口设计、软件设计等。项目设计高速DAC采用了ADI公司的AD9129,该芯片最大更新速率5.7Gsps,该芯片在宽带通信应用、LTE、雷达信号产生、干扰机等领域有广泛应用。

FPGA_Designer 2533

apriori算法实现_Apriori算法详解

Apriori算法简介Apriori算法是一种常用的用于挖掘出数据关联规则(Association Rules)的算法,“apriori”在拉丁语中翻译为“来自以前”,顾名思义,这个算法是使用先验知识来预测数据的关联规则。说到关联规则,我们不得不提到一个经典案例——啤酒与尿布。在这个案例中,沃尔玛发现看似两个无关的商品,它们却经常被一起购买,这是为什么呢?在美国有婴儿的家庭中,一般是母亲...

weixin_42365492的博客 1万+

在线考试题库抓取:Python 爬虫抓取各类在线考试平台题库和试题

通过这些技术,您可以抓取各类在线考试平台上的题库数据,进行数据分析、生成练习题集,甚至用于考试准备。为了演示抓取过程,本篇博客选择了两个常见的在线考试平台进行数据抓取:一个是教育考试平台(如“中小学题库”),另一个是职业考试平台(如“华图教育”)。对于这些网站,我们需要找到包含题库信息的页面,并分析每一页的 HTML 结构,从而定位到题目、选项、答案等数据。大多数在线考试平台的题库是分页显示的,因此我们需要遍历多个页面,抓取所有的题库数据。因此,我们需要设置合适的请求头来模拟真实的浏览器请求。

2201_76125261的博客 3427

AI处理器组合

编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中的处理器不能通信,如下图所示。- 如果申请处理器个数为1,则选择同一链路,剩余可用的处理器数量为1个的最佳,其次是剩余3个的为次佳,然后是剩余2个,最后是剩余4个。输出为组合列表,当array=[0, 1, 4, 5, 6, 7] ,num=1时,输出为[[0], [1]]- 如果申请处理器个数为2,则选择同一链路剩余可用的处理器数量2个的为最佳,其次是剩余4个,最后是剩余3个。任务申请1个处理器。

面试高手的博客 1万+
上一篇: Apriori算法第一篇
下一篇: 关联规则算法---Eclat算法
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值