Hadoop好友推荐系统-聚类中心及占比查看

项目总目录:基于Hadoop的好友推荐系统项目综述

一、前端展示

1、jsp页面

<input class="easyui-validatebox" type="text"
    id="group_input_id" data-options="required:true" style="width:300px"
                    value="WEB-INF/classes/centervector.dat" />
  <a id="group_check_id" href="" class="easyui-linkbutton" data-options="iconCls:'icon-note'">查看</a>
  <br><hr><br>
    </div>

   <div style="padding-left: 30px;font-size: 15px;padding-top:10px;"><br>
        这里的数据不包括过滤的数据以及未分类的数据,即只包含已分类的数据<br>
    </div>

    <div id="group_return_id" style="padding-left: 30px;font-size: 20px;padding-top:10px;"></div>

jsp页面指定了数据的输入文件:WEB-INF/classes/centervector.dat

2、js逻辑

// group //查看聚类中心及占比
    $('#group_check_id').bind('click', function(){
        var input_i=$('#group2db_input_id').val();
        // 弹出进度框
        popupProgressbar('聚类中心','聚类中心解析中...',1000);
        // ajax 异步提交任务
        getCenterAndDisplay("cloud/cloud_groupcheck.action");
    });

这里使用getCenterAndDisplay实现任务提交。

/**
 * 获取中心点并展示
 * 
 * @param url_
 */
function getCenterAndDisplay(url_){
    $.ajax({
        url : url_,
        data: {},
        async:true,
        dataType:"json",
        context : document.body,
        success : function(data) {
            closeProgressbar();
            var retMsg;
            if("true"==data.flag){
                retMsg='操作成功!';
                // 展示返回数据
                $('#group_return_id').html(data.html);
            }else{
                retMsg='操作失败!失败原因:'+data.msg;
            }

            $.messager.show({
                title : '提示',
                msg : retMsg
            });

        }
    });

}

二、后台实现

1、action层

对应的action从这里获取:getCenterAndDisplay(“cloud/cloud_groupcheck.action”);

    /**
     * 解析本地聚类中心数据,并获得数据库中分类数据占比情况
     * 返回前台显示
     */
    public void groupcheck(){
        Map<String,Object> map = new HashMap<String,Object>();
        List<String> centerVec=null;
        List<String> percentVec=null;
        try{
            input = input==null ? HUtils.LOCALCENTERFILE:input;
            centerVec= Utils.getLines(input);//获取聚类中心
            percentVec=  dBService.getPercent(centerVec.size());//计算各个聚类簇占总数的百分比
            // 整合数据
            StringBuffer buff = new StringBuffer();
            buff.append("<br>");
            for(int i=0;i<centerVec.size();i++){
                buff.append("聚类中心:"+centerVec.get(i)+"\t,占比:"+percentVec.get(i)+"<br>");
            }
            map.put("html", buff.toString());
            map.put("flag","true");
        }catch(Exception e){
            map.put("flag", "false");
            map.put("msg", "解析聚类中心出错!");
            e.printStackTrace();
        }
        Utils.write2PrintWriter(JSON.toJSONString(map));
        return ;
    }

2、获取聚类中心

Utils.getLines的定义如下:

/**
     * 获得input的数据,每行作为一个字符串,全部数据放入list中
     * @param input
     * @return
     * @throws IOException 
     */
    public static List<String> getLines(String input) throws IOException {
        List<String> list = new ArrayList<String>();
        input = Utils.getRootPathBasedPath(input);
        FileReader reader = new FileReader(input);
        BufferedReader br = new BufferedReader(reader);

        String line = null;
        while((line = br.readLine()) != null) {
            list.add(line);
         }

        br.close();
        reader.close();
        return list;
    }

3、计算百分比

    /**
     * 获取分类数据占比
     * 
     * @param i
     * @return
     */
    public List<String> getPercent(int k) {
        double[] percents = new double[k];
        double sum = 0;
        String hql = "select count(1) from UserGroup ug where ug.groupType=?";
        for (int i = 0; i < k; i++) {
            percents[i] = baseDao.count(hql, new Object[] { i + 1 });//查找属于聚类中心i的数据个数
            sum += percents[i];//统计数据总数
        }
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < k; i++) {
            list.add(Utils.obejct2Percent(percents[i] / sum, 2));// 计算每个聚类簇中数目的百分比,保留两位小数
        }
        return list;
    }

三、程序运行截图

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值