稀疏矩阵算余弦相似度

import java.util.HashMap;

import com.aliyun.odps.udf.UDF;

/***
 * BASE UDF
 */
public final class MyUDF extends UDF {
    /**
     * 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));		
	}
}

你可能感兴趣的:(数据挖掘,相似度,稀疏矩阵)