转载请标明出处http://www.cnblogs.com/haozhengfei/p/82c3ef86303321055eb10f7e100eb84b.html


PIC算法   幂迭代聚类

     PIC算法全称Power iteration clustering 幂迭代聚类

1.谱聚类

   幂迭代聚类的前身--谱聚类,基于图论的计算方法。(可以用点来表示对象,对象之间的关系用连线表示,Neo4j 图数据库用来做用户与用户之间的关系,它可以存两个对象之间的关系,它是半开源的单机版免费,集群版收费,它的规模不是很大,也就是几千万级别,如果数据量很大,也可以用Spark中的图计算Graphx)

2.谱聚类分割方法

相似度与权重:
   将每条数据当做图中的每个点,数据与数据之间的相似度为点和点的边的权重
谱聚类的分割方法:
        最优分割的原则是使子图内部边的权重之和最大,子图之间的边的权重之和最小。
 
        距离越小,相似度越高,那么权重之和越大
        – Mcut(最小割集)
        – Ncut (规范割集)一般使用Ncut多一些,既考虑最小化cut边又划分平衡。避免出现很多个单点离散的图
 
谱聚类的实现方式和步骤_NCut规范格局(如果是Mcut采用倒数第二小的特征即为所求):
        1.构建相似度矩阵(相似度矩阵可用邻接矩阵表示),指定聚类个数K;
        2.利用相似度矩阵构建拉普拉斯矩阵L
        3.计算标准化之后的拉普拉斯矩阵LK个特征向量,并按照特征值升序排序
        4.对由K个特征向量组成的矩阵按照每行进行Kmeans聚类
        5.将聚类结果的各个簇分别打上标记,对应上原数据,输出结果
 
    补充:
        点与点之间关联的邻接矩阵 
        拉普拉斯矩阵 = 度矩阵 - 邻接矩阵  (度矩阵:无向图中的度指的是连接一个点的边有多少,有向图中有出入度的概念,出度和入度,可以用邻接矩阵中每一行相加求出 度矩阵)
 
        矩阵M * 向量L = 向量L,但是如果矩阵M * 向量L = 向量L * 数值a,那么L就是M的特征向量,a就是相应的特征值。(一个矩阵不一定会有特征向量,也可能有很多的特征向量。一个特征向量会有一个特征值,二者是成对出现的)
 
        矩阵的特征值和特征向量,矩阵中的每一行*一个特征向量相当于将矩阵中的一行映射到向量中指定的某一点,这种方式从某种角度上做到了降维。

3.PIC算法VS谱聚类

   PIC和谱聚类算法类似,都是通过将数据嵌入到由相似矩阵映射出来的低维子空间中,然后直接或者通过kmean算法得到聚类结果
 
   它们的不同点在于如何嵌入及产生低维子空间
       – 谱聚类是通过拉普拉斯矩阵产生的最小向量构造的
       – Pic利用数据规范化的相似度矩阵,采用截断的快速迭代法

4谱聚类code

train
PowerIterationClustering_new
 import org.apache.log4j.{Level, Logger}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.clustering.PowerIterationClustering /**
* Created by hzf
*/
object PowerIterationClustering_new {
// E:\IDEA_Projects\mlib\data\pic\train\pic_data.txt E:\IDEA_Projects\mlib\data\pic\model 3 20 local
def main(args: Array[String]) {
Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
if (args.length < 5) {
System.err.println("Usage: PIC <inputPath> <modelPath> <K> <iterations> <master> [<AppName>]")
System.exit(1)
}
val appName = if (args.length > 5) args(5) else "PIC"
val conf = new SparkConf().setAppName(appName).setMaster(args(4))
val sc = new SparkContext(conf)
val data: RDD[(Long, Long, Double)] = sc.textFile(args(0)).map(line => {
val parts = line.split(" ").map(_.toDouble)
(parts(0).toLong, parts(1).toLong, parts(2))
}) val pic = new PowerIterationClustering()
.setK(args(2).toInt)
.setMaxIterations(args(3).toInt)
val model = pic.run(data) model.assignments.foreach { a =>
println(s"${a.id} -> ${a.cluster}")
}
model.save(sc, args(1))
}
}
设置运行参数
  1. E:\IDEA_Projects\mlib\data\pic\train\pic_data.txt E:\IDEA_Projects\mlib\data\pic\model 320 local
 

MLlib--PIC算法的更多相关文章

  1. Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS

    Spark MLlib回归算法------线性回归.逻辑回归.SVM和ALS 1.线性回归: (1)模型的建立: 回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多 ...

  2. spark mllib k-means算法实现

    package iie.udps.example.spark.mllib; import java.util.regex.Pattern; import org.apache.spark.SparkC ...

  3. Spark MLlib回归算法LinearRegression

    算法说明 线性回归是利用称为线性回归方程的函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析方法,只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归,在实际情况中大多数都是多 ...

  4. Spark MLlib基本算法【相关性分析、卡方检验、总结器】

    一.相关性分析 1.简介 计算两个系列数据之间的相关性是统计中的常见操作.在spark.ml中提供了很多算法用来计算两两的相关性.目前支持的相关性算法是Pearson和Spearman.Correla ...

  5. Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)

    Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...

  6. Spark2.0机器学习系列之11: 聚类(幂迭代聚类, power iteration clustering, PIC)

    在Spark2.0版本中(不是基于RDD API的MLlib),共有四种聚类方法:             (1)K-means             (2)Latent Dirichlet all ...

  7. 转载:Databricks孟祥瑞:ALS 在 Spark MLlib 中的实现

    Databricks孟祥瑞:ALS 在 Spark MLlib 中的实现 发表于2015-05-07 21:58| 10255次阅读| 来源<程序员>电子刊| 9 条评论| 作者孟祥瑞 大 ...

  8. Spark入门实战系列--8.Spark MLlib(上)--机器学习及SparkMLlib简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .机器学习概念 1.1 机器学习的定义 在维基百科上对机器学习提出以下几种定义: l“机器学 ...

  9. 使用 Spark MLlib 做 K-means 聚类分析[转]

    原文地址:https://www.ibm.com/developerworks/cn/opensource/os-cn-spark-practice4/ 引言 提起机器学习 (Machine Lear ...

随机推荐

  1. Nodejs密集型CPU解决方案

    首先说一下nodejs单线程的优势: 高性能,与php相比,避免了频繁创建切换线程的开销,执行更加迅速,资源占用小. 线程安全,不用担心同一变量被多线程读写,造成程序崩溃. 单线程的异步和非阻塞,其实 ...

  2. 由于DG Broker的配置导致RAC某实例无法mount

    今天碰到一个我自己实验室发生的故障,起初看起来很简单,但实际上还很有趣,而且不细心的话还容易被忽视掉.相信在生产环境也会有客户会实际遇到. 环境:Oracle 11.2.0.4 RAC (2 node ...

  3. Python 项目实践三(Web应用程序)第三篇

    接着上节的继续学习,现在要显示所有主题的页面 有了高效的网页创建方法,就能专注于另外两个网页了:显示全部主题的网页以及显示特定主题中条目的网页.所有主题页面显示用户创建的所有主题,它是第一个需要使用数 ...

  4. 妙味课堂:JavaScript初级--第12课:json与数组

    1.json数据格式及json语法 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  5. 物流包裹一站式查询(TrackingMore)

    快递查询接口 目前提供快递查询的接口平台有: Trackingmore 快递100 快递网 不同接口的区别: (1)Trackingmore支持380家快递公司,其中有55家为国内的快递,其余325家 ...

  6. Netty之ProtoBuf(六)

    Protocol Buffer的基本使用(六) 一.简介 Protocol Buffer(简称ProtoBuf)是google的一个语言中立,平台中立,可扩展的对结构化的数据进行序列化的一种机制,和X ...

  7. 我的web聊天之---序章

    有时候自我感觉良好,人啊就开始膨胀,细细想来,自己还是那么苍白.---- 致傻傻的我 大家都知道,平时上班总是拿着手机看看微信,看看新闻,这个不太好,这不是重点,重点是我们公司web版本的微信,QQ都 ...

  8. 多行文字水平垂直居中在div

    <BODY>   <div class="box">    <h3>1.单行文字居中</h3>    <!--设置行高来实现- ...

  9. 利用scrapy框架进行爬虫

    今天一个网友问爬虫知识,自己把许多小细节都忘了,很惭愧,所以这里写一下大概的步骤,主要是自己巩固一下知识,顺便复习一下.(scrapy框架有一个好处,就是可以爬取https的内容) [爬取的是杨子晚报 ...

  10. Java 非线程安全的HashMap如何在多线程中使用

    Java 非线程安全的HashMap如何在多线程中使用 HashMap 是非线程安全的.在多线程条件下,容易导致死循环,具体表现为CPU使用率100%.因此多线程环境下保证 HashMap 的线程安全 ...