JAVA计算稀疏矩阵余弦相似度


public class MyUDF  {
    /**
     * UDF Evaluate接口
     * 
     * UDF在记录层面上是一对一,字段上是一对一或多对一。 Evaluate方法在每条记录上被调用一次,输入为一个或多个字段,输出为一个字段
     */
    public Double evaluate(String a, String b) {
        // TODO: 请按需要修改参数和返回值,并在这里实现你自己的逻辑
    	if(a==null || b==null)
    		return 0.0;
    	String temp1[]=a.split(",");
		String temp2[]=b.split(",");
		if (temp1==null || temp2==null) {
			return 0.0;
		}
		HashMap<String, Double> map1=new HashMap<String, Double>();
		HashMap<String, Double> map2=new HashMap<String, Double>();
		for(String temp:temp1)
		{
			String t[]=temp.split(":");
			map1.put(t[0], Double.parseDouble(t[1]));
		}
		for(String temp:temp2)
		{
			String t[]=temp.split(":");
			map2.put(t[0], Double.parseDouble(t[1]));
		}
		double fenzi=0;
		double fenmu1=0;
		for(String i:map1.keySet())
		{
			double value=map1.get(i);
			if (map2.get(i)!=null) {
				fenzi+=value*map2.get(i);
			}
			fenmu1+=value*value;
		}
		double fenmu2=0;
		for(double i:map2.values())
		{
			fenmu2+=i*i;
		}
		double fenmu=Math.sqrt(fenmu1)*Math.sqrt(fenmu2);
		return fenzi/fenmu;
    }
    public static void main(String[] args) {
		String a="12:500,14:100,20:200";
		String b="12:500,14:100,30:100";
		MyUDF myUDF=new MyUDF();
		System.out.println(myUDF.evaluate(a, b));		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值