好长时间忙的没写博客了。看到有人问spark的knn,想着做推荐入门总用的knn算法,顺便写篇博客。
作者:R星月 http://www.cnblogs.com/rxingyue/p/6182526.html
knn算法的大致如下:
1)算距离:给定测试对象,计算它与训练集中的每个对象的距离
2)找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻
3)做分类:根据这k个近邻归属的主要类别,来对测试对象分类
这次用spark实现knn算法。
首先要加载数据:
实验就简单点直接模拟:
List> data = new ArrayList>();for (int i = 0; i < 100; i++) {
data.add(newNode(String.valueOf(i), i));
}
JavaRDD> nodes = sc.parallelize(data);
再设计距离的度量,做一个简单的实验如下:
new SimilarityInterface() {
public doublesimilarity(Integer value1, Integer value2) {
return 1.0 / (1.0 + Math.abs((Integer) value1 -(Integer) value2));
}
};
距离度量为一个接口可以实现你自己想要的距离计算方法,如cos,欧几里德等等。
再这要设置