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

结果如下: 编号最近的30个值。

以上就算把knn算法在spark下完成了,剩下要做的就是根据一个数据点进行搜索最相近的k个值。
搜索:
final Node<Integer> query = new Node(String.valueOf(), );
final NeighborList neighborlist_exhaustive
= exhaustive_search.search(query, );
这段代码是搜索 结点id为111,数值为50最近的5个值。
结果如下:

代码很简单:
/**
* Created by lsy 983068303@qq.com
* on 2016/12/15.
*/
public class TestKnn {
public static void main(String[] args) throws Exception {
SparkConf conf = new SparkConf();
conf.setMaster("local[4]");
conf.setAppName("knn");
// conf.set("spark.executor.memory","1G");
// conf.set("spark.storage.memoryFraction","1G");
JavaSparkContext sc = new JavaSparkContext(conf); List<Node<Integer>> data = new ArrayList<Node<Integer>>();
for (int i = ; i < ; i++) {
data.add(new Node(String.valueOf(i), i));
}
final SimilarityInterface<Integer> similarity =new SimilarityInterface<Integer>() {
public double similarity(Integer value1, Integer value2) {
return 1.0 / (1.0 + Math.abs((Integer) value1 - (Integer) value2));
}
};
JavaRDD<Node<Integer>> nodes = sc.parallelize(data);
NNDescent nndes = new NNDescent<Integer>();
nndes.setK();
nndes.setMaxIterations();
nndes.setSimilarity(similarity);
JavaPairRDD<Node, NeighborList> graph = nndes.computeGraph(nodes); graph.saveAsTextFile("out");
ExhaustiveSearch exhaustive_search
= new ExhaustiveSearch(graph, similarity);
graph.cache();
final Node<Integer> query = new Node(String.valueOf(), );
final NeighborList neighborlist_exhaustive
= exhaustive_search.search(query, );
for(Neighbor n:neighborlist_exhaustive){
System.out.print("id编号:"+n.node.id+"==============") ;
System.out.println("对应的数值:"+n.node.id) ;
}
sc.stop();
}
spark 之knn算法的更多相关文章
- spark 机器学习 knn 代码实现(二)
通过knn 算法规则,计算出s2表中的员工所属的类别原始数据:某公司工资表 s1(训练数据)格式:员工ID,员工类别,工作年限,月薪(K为单位) 101 a类 8年 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- KNN算法
1.算法讲解 KNN算法是一个最基本.最简单的有监督算法,基本思路就是给定一个样本,先通过距离计算,得到这个样本最近的topK个样本,然后根据这topK个样本的标签,投票决定给定样本的标签: 训练过程 ...
- kNN算法python实现和简单数字识别
kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...
- 什么是 kNN 算法?
学习 machine learning 的最低要求是什么? 我发觉要求可以很低,甚至初中程度已经可以. 首先要学习一点 Python 编程,譬如这两本小孩子用的书:[1][2]便可. 数学方面 ...
- 数据挖掘之KNN算法(C#实现)
在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种.该算法是一种惰性学习法(lazy learner),与决策树.朴素贝叶斯这些急切学习法(eager learner)有所区别.惰性学习法仅仅 ...
- 机器学习笔记--KNN算法2-实战部分
本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...
- 机器学习笔记--KNN算法1
前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...
- 学习OpenCV——KNN算法
转自:http://blog.csdn.net/lyflower/article/details/1728642 文本分类中KNN算法,该方法的思路非常简单直观:如果一个样本在特征空间中的k个最相似( ...
随机推荐
- game with probability problem
两个人 A, B 取 n 枚石子,祂们轮流抛硬币 (A 先手),每次抛硬币,如果是正面,就取出一枚石子,否则什么都不做,然而 A, B 有一种超能力,在抛硬币前在意志中确定一面 (正面或反面),然后就 ...
- 2017-11-8 NOIP模拟赛
1.足球联赛 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm ...
- iOS通过SocketRocket实现websocket的即时聊天
之前公司的即时聊天用的是常轮循,一直都觉得很不科学,最近后台说配置好了socket服务器,我高兴地准备用asyncsocket,但是告诉我要用websocket,基于HTML5的,HTML5中提出了一 ...
- Filter&Listener
Filter&Listener 内容待补充... ...
- 在谷歌地图上绘制行政区域轮廓【结合高德地图的API】
实现思路: 1.利用高德地图行政区域API获得坐标列表 2.将坐标列表绘制在谷歌地图上[因为高德地图和国内的谷歌地图都是采用GCJ02坐标系,所有误差很小,可以不进行坐标误差转换] 注意点: 1.用百 ...
- Webpack热加载和React(其中有关于include和exclude的路径问题)
看了几个React配合webpack的教程,大部分都因为版本问题过时了.终于找到了一个不错的教程.记录下其中的知识点. 首先万分感谢这个教程的制作者.少走了许多弯路,正在学习webpack的小伙伴可以 ...
- centos7.3下配置本地yum仓库
部署openstack时,网络yum源安装慢,而且经常中的提示找不到mirrors,所以配置一个本地的安装源很有必要,来解决这个揪心的问题. 安装:yum install yum-utils crea ...
- Luogu P3391 文艺平衡树(Splay or FHQ Treap)
这道题要求区间反转...好东西.. 对于Splay:把l-1旋到根,把r+1旋到根的右儿子,这样r+1的左儿子就是整个区间了,然后对这个区间打个tg 注意要插-Inf和Inf到树里面,防止越界,坐标要 ...
- C/C++规范学习:
一 关于浮点数: 1.1浮点数是否等于0判断:因为浮点数都有精度,不能拿浮点数直接和0.0f进行比较,而应该采用以下方法: if (f32Data == 0.0f) // 隐含错误的比较 #defin ...
- Linux网络编程函数
1. Server端-socket/bind/listen/accept/read socket(AF_INET, SOCK_STREAM, 0); //指定端口,内核将端口上的数据转发给该socke ...