好长时间忙的没写博客了。看到有人问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算法的更多相关文章

  1. spark 机器学习 knn 代码实现(二)

    通过knn 算法规则,计算出s2表中的员工所属的类别原始数据:某公司工资表 s1(训练数据)格式:员工ID,员工类别,工作年限,月薪(K为单位)       101       a类       8年 ...

  2. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  3. KNN算法

    1.算法讲解 KNN算法是一个最基本.最简单的有监督算法,基本思路就是给定一个样本,先通过距离计算,得到这个样本最近的topK个样本,然后根据这topK个样本的标签,投票决定给定样本的标签: 训练过程 ...

  4. kNN算法python实现和简单数字识别

    kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...

  5. 什么是 kNN 算法?

    学习 machine learning 的最低要求是什么?  我发觉要求可以很低,甚至初中程度已经可以.  首先要学习一点 Python 编程,譬如这两本小孩子用的书:[1][2]便可.   数学方面 ...

  6. 数据挖掘之KNN算法(C#实现)

    在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种.该算法是一种惰性学习法(lazy learner),与决策树.朴素贝叶斯这些急切学习法(eager learner)有所区别.惰性学习法仅仅 ...

  7. 机器学习笔记--KNN算法2-实战部分

    本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...

  8. 机器学习笔记--KNN算法1

    前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...

  9. 学习OpenCV——KNN算法

    转自:http://blog.csdn.net/lyflower/article/details/1728642 文本分类中KNN算法,该方法的思路非常简单直观:如果一个样本在特征空间中的k个最相似( ...

随机推荐

  1. 51nod1419 【数学】

    思路: n<=3,就是n. 考虑n>3: 我们可以轻松证明n,n-1这两个数互质: 设gcd(n,n-1)=g,n=g*k1,n-1=g*k2; n-(n-1)=g(k1-k2)=1; 所 ...

  2. 《OD学hadoop》20160904某旅游网项目实战

    一.ETL操作 抽取数据 日志格式: 分割符号:^A IP地址 服务器时间 二.Java工程 1. 创建项目 copy代码及配置文件 2. 改配置 core-site.xml hbase-site.x ...

  3. bzoj4873: [Shoi2017]寿司餐厅(最小割)

    传送门 大佬们是怎么一眼看出这是一个最大权闭合子图的……大佬好强->这里 1.把所有区间$(i,j)$看成一个点,如果权值大于0,则从$S$向他连边,容量为权值,否则从它向$T$连边,容量为权值 ...

  4. jmeter - 录制app接口

    准备: 1.手机 2.wifi 3.Jmeter   步骤: 1.Jmeter->文件->Template    2.手机设置代理 端口:8888:电脑的ip,如下图设置 3.点击启动   ...

  5. ajax跨域问题解决方案(jsonp,cors)

    跨域 跨域有三个条件,满足任何一个条件就是跨域 1:服务器端口不一致 2:协议不一致 3:域名不一致 解决方案: 1.jsonp 在远程服务器上设法动态的把数据装进js格式的文本代码段中,供客户端调用 ...

  6. Objective-C对象的申请空间与初始化

    对象分配空间与初始化 对象分配空间与初始化 使用Objective-C语言创建一个对象有两个步骤,你必须: 为新对象动态分配内存空间 初始化新分配的内存,并赋初值 不经过如上两步,一个对象就没有完全功 ...

  7. 分层图最短路【bzoj2662】[BeiJing wc2012]冻结

    分层图最短路[bzoj2662][BeiJing wc2012]冻结 Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" ...

  8. 多实例:MySQL系列之二

    MySQL的多实例配置 ​ 在一台物理机中需要多个测试环境,那么就需要用到了搭建数据库的多个实例,多个实例的意思就是运行多份程序,实例与实例之间没有影响.要注意监听的端口需要不同. 环境:CentOS ...

  9. 2018年12月30&31日

    小结:昨天由于做的题目比较少,所以就和今天写在一块了,昨天学习了差分约束和树上差分,当然树上差分是用线段树来维护的,今天重点整理了博客\(233\),然后做了几个题. 一. 完成的题目: 洛谷P327 ...

  10. ch8 -- useLK

    useLK 光流法跟踪FAST角点 执行    ./useLK ../../data 运行程序. 光流法需要include<opencv2/video/tracking.hpp>,用到列表 ...