java基于mahout内存应用关联规则推荐算法fpgrowth

最近在用mahout基于内存的应用关联规则推荐算法,发现网上的代码资料很少,所以把代码写下来


 double transactionCount=5354;//训练集购物篮数据总数

  int minSupport = 3; 

        int maxHeapSize = 50; 

        String input = "./models/text/action.dat"

        String output = "output"

        FPGrowth<String> fp = new FPGrowth<String>(); 

        FileSystem fs = new RawLocalFileSystem(); 

        Configuration conf = new Configuration(); 

        String pattern = "[\\ ]";     

        try

            fs = FileSystem.get(conf);

            SequenceFile.Writer writer = null

            writer = new SequenceFile.Writer(fs, conf,new Path(output),Text.class, TopKStringPatterns.class); 

            Charset encoding = Charset.forName("UTF-8"); 

            List<Pair<String, Long>> generateFList = null

            StringRecordIterator transactions = null

            StringRecordIterator fptransactions =null

            transactions = new StringRecordIterator(new FileLineIterable(new 

File(input), encoding, false), pattern); 

            fptransactions=transactions;

            System.out.print("\nthe end! ");

            generateFList = fp.generateFList(new StringRecordIterator(new FileLineIterable(new File(input), encoding,false), 

                    pattern), minSupport); 

            StatusUpdater updater = new StatusUpdater(){

            @Override 

                            public void update(String status) { 

                            } 

            };

            List<Text> keyList = new LinkedList<Text>(); 

            List<TopKStringPatterns> valueList = new 

LinkedList<TopKStringPatterns>(); 

            StringOutputCollector<Text, TopKStringPatterns> collector =new StringOutputCollector<Text, TopKStringPatterns>(keyList, valueList); 

            StringOutputConverter soc = new StringOutputConverter(collector); 

            System.out.print("\n 开始! ");

            fp.generateTopKFrequentPatterns(transactions, generateFList,minSupport, maxHeapSize,null, soc,  updater); 

            writer.close(); 

            fs.close(); 

           

            HashSet<List<String>> unique =new HashSet<List<String>>(); 

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

              long firstFrequencyItem = -1;

                  String firstItemId = null;

                System.out.println(keyList.get(i) +" / " + valueList.get(i)); 

                List<Pair<List<String>, Long>> iterator = valueList.get(i).getPatterns(); 

                int j=0;

                for(Pair<List<String>, Long> pair: iterator) { 

                List<String> itemList = pair.getFirst();

                    Long occurrence = pair.getSecond();

                    if (j == 0) {

                        firstFrequencyItem = occurrence;

                        firstItemId = itemList.get(0)+"";

                    } else {

                    double support = (double)occurrence / transactionCount;

                        double confidence = (double)occurrence / firstFrequencyItem;

                            List<String> listWithoutFirstItem = new ArrayList();

                            for(String itemId: itemList) {

                                if (!itemId.equals(firstItemId)) {

                                    listWithoutFirstItem.add(itemId);

                                }

                            }

                            listWithoutFirstItem.remove(firstItemId);

                            System.out.printf("%s => %s: supp=%.3f, conf=%.3f",listWithoutFirstItem,firstItemId,support,confidence);

                            if (itemList.size() == 2) {

                                intotherItemId = -1;

                                for(String itemId: itemList) {

                                    if (!itemId.equals(firstItemId)) {

                                        otherItemId = Integer.parseInt(itemId);

                                        break;

                                    }

                                  }

                                }


                                System.out.printf("\n");


                    }

                    j++;

                } 

            } 


        } catch (IOException e) { 

            e.printStackTrace(); 

        } 


 

}

该算法是java改写mahout的

org.apache.mahout.fpm.pfpgrowth.FPGrowthDriver内启动项,先生成频繁项,这里把mahout应该生成的频繁项文件output改为放到soc对象中去,通过生成的频繁项 再去生成支持度和置信度



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值