Spark K-Means

K-Means(K均值)

介绍

K-Means是被应用的最广泛的基于划分的聚类算法,是一种硬聚类算法,属于典型的局域原型的目标函数聚类的代表。算法首先随机选择k个对象,每个对象初始地代表一个簇的平均值或者中心。对于剩余的每个对象,根据其到各个簇中心的距离,把他们分给距离最小的簇中心,然后重新计算每个簇平均值。重复这个过程,直到聚类准则则函数收敛。准则函数一般采用两种方式:第一种是全局误差函数,第二种是前后两次中心误差变化。

与分类不同,分类是监督学习,要求分类前明确各个类别,并断言每个元素映射到一个类别,而聚类是观察式学习,在聚类前可以不知道类别甚至不给定类别数量,是无监督学习的一种。目前聚类广泛应用于统计学、生物学、数据库技术和市场营销等领域,相应的算法也非常的多。

K-Means属于无监督学习,最大的特别和优势在于模型的建立不需要训练数据。在日常工作中,很多情况下没有办法事先获取到有效的训练数据,这时采用K-Means是一个不错的选择。但K-Means需要预先设置有多少个簇类(K值),这对于像计算某省份全部电信用户的交往圈这样的场景就完全的没办法用K-Means进行。对于可以确定K值不会太大但不明确精确的K值的场景,可以进行迭代运算,然后找出cost最小时所对应的K值,这个值往往能较好的描述有多少个簇类。

 

运用场景

      1.商务上,帮助市场分析人员从客户基本库中发现不同的客户群,并且用购买模式来刻画不同的客户群特征。

      2.生物学上,用于推导植物和动物的分类,对基因的分类,获得对种群中固有结构的认识。

      3.互联网上,用于对Web上的文档进行分类从而发现信息。

      4.对一个游戏中的玩家进行分类(下面的案例)。

工作原理

      针对包含n个对象的数据集合D以及初始化的聚类数目k,使用下面的算法。

1.从数据集合D中随机选择k个对象作为初始簇中心。

2.根据簇的中心值,把数据集合中的n个对象全部分给最“相似”的簇(“相似”根据距离长短来判断)。

3.根据簇的中心值,重新计算每个簇的中心值。

4.计算准则函数。

5.若准则函数满足阈值则退出,否则返回第二步继续。

输入数据说明

数据:玩家信息(月)

玩家(ID)

游戏时间(小时)

充值金额(元)

1

60

55

2

90

86

3

30

22

4

15

11

5

288

300

6

223

200

7

0

0

8

14

5

9

320

280

10

65

55

11

13

0

12

10

18

13

115

108

14

3

0

15

52

40

16

62

76

17

73

80

18

45

30

19

1

0

20

180

166

 

数据抽象为如下,含义为 游戏时间(小时),充值金额(元)


把玩家分为3类:

1.优质用户(高时长,高消费)

      2.普通玩家(在线时长中等,消费中等)

      3.不活跃用户    (在线时间短,消费低)              

流程图

 

测试代码

import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.{SparkConf, SparkContext}

object KMeansTest {
 
def main(args: Array[String]) {
     
val conf = new SparkConf()
     
val sc = new SparkContext(conf)

   
val data =sc.textFile(args(0))
   
val parsedData =data.map(s => Vectors.dense(s.split(' ').map(_.trim.toDouble))).cache()

   
//设置簇的个数为3
   
val numClusters =3
   
//迭代20
    val numIterations= 20
   
//运行10次,选出最优解
    val runs=10
   
val clusters =KMeans.train(parsedData, numClusters, numIterations,runs)
   
// Evaluateclustering by computing Within Set Sum of Squared Errors
   
val WSSSE = clusters.computeCost(parsedData)
    println(
"WithinSet Sum of Squared Errors = " + WSSSE)

   
val a21 =clusters.predict(Vectors.dense(57.0,30.0))
   
val a22 =clusters.predict(Vectors.dense(0.0,0.0))

   
//打印出中心点
   
println("Clustercenters:");
    for
(center <-clusters.clusterCenters) {
      println(
" "+ center)
    }

   
//打印出测试数据属于哪个簇
   
println(parsedData.map(v=> v.toString() + " belong to cluster :" +clusters.predict(v)).collect().mkString("\n"))
    println(
"预测第21个用户的归类为-->"+a21)
    println(
"预测第22个用户的归类为-->"+a22)
  }
}

提交代码脚本(standalone模式):

./bin/spark-submit

--name kmeans   \                         (项目名)

--class naiveBayes  \                     (主类名)

--master spark://master:7077  \           (使用集群管理器)

~/Desktop/kmeans.jar     \                  (代码包位置)

Hdfs://master:9000/KMeansTest.data             (args(0)的参数值)

输出结果说明

 

可以明显的看到:

1类用户为优质用户

2类用户为普通用户

3类用户为不活跃用户

 

 

21个用户的数据为(57,30)

22个的用户数据为(0,0)

分类是正确的

 

三个簇的聚集中心

转载于:https://www.cnblogs.com/xiaomaohai/p/6158068.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kail利用msf工具对ms17-010(永恒之蓝)漏洞入侵渗透Win7

kail利用msf工具对ms17-010&#xff08;永恒之蓝&#xff09;漏洞入侵渗透Win7 前言&#xff1a; 提到操作系统漏洞&#xff0c;大家肯定听说过耳熟能详的永恒之蓝&#xff08;MS17-010&#xff09;了&#xff0c;他的爆发源于WannaCry勒索病毒的诞生。 该病毒是不法分子利用…

mysql 删除版本信息_linux 删除mysql

写作背景明天项目上线&#xff0c;今天晚上在客户的机房进行网站的部署&#xff0c;在安装mysql的时候出现了一个问题&#xff0c;就是死活安装不上&#xff0c;说已经存在mysql,最后分析错误信息才知道&#xff0c;原来是centos 6.3 自带安装了mysql 5.1&#xff0c;因为我是通…

微信连接WIFI并关注公众号的方法

分享一个改造路由器来实现微信连wifi关注公众已经成为一种高效的引流方法。 前提是先有自己的路由器、认证的公众号&#xff08;服务号或订阅号&#xff09;、开通过门店小程序。 1.进入公众号后以此选择“微信连wifi”→“设备管理”→详情&#xff0c;拿到公众号的三个参数…

kali利用msf工具对ms08-067漏洞入侵靶机(win xp2)

kali利用msf工具对ms08-067漏洞入侵靶机&#xff08;win xp2&#xff09; 漏洞简介 MS08-067漏洞将会影响Windows 2000/XP/Server 2003/Vista/Server 2008的各个版本&#xff0c;甚至还包括测试阶段的Windows 7 Pro-Beta。 如果用户在受影响的系统上收到特制的 RPC 请求&…

tomcat mysql如何优化_Tomcat+Mysql高并发配置优化讲解

1.Tomcat优化配置(1)更改Tomcat的catalina.bat将java变成server模式&#xff0c;增大jvm的内存&#xff0c;在文件开始位置增加setJAVA_OPTS-server -Xms1024m -Xmx2048m -Xss512K -XX:PermSize128m-XX:MaxPermSize256msetCATALINA_OPTS-server -Xms512m -Xmx512m如下图&#x…

DEV控件中GridView中的复选框与CheckBox实现联动的全选功能

最初的界面图如图1-1&#xff08;全选框ID&#xff1a; cb_checkall DEV控件名称&#xff1a;gcCon &#xff09;&#xff1a; 要实现的功能如下图&#xff08;1-2 1-3 1-4&#xff09;及代码所示&#xff1a; 图1-2 图1-3 图1-4 O(∩_∩)O哈哈~ 不要着急哦&#xff0c;看清…

CSDN转载别人文章的操作

说在前面 对于喜欢逛CSDN的人来说&#xff0c;看别人的博客确实能够对自己有不小的提高。有时候看到特别好的博客想转载&#xff0c;但是不能一个字一个字的敲&#xff0c;一张图片一张图片的截图&#xff0c;这样怪麻烦也浪费时间。这时候我们就想转载别人的博客&#xff0c;那…

python编程头文件_python头文件的编程风格

python头文件的编程风格发布时间&#xff1a;2020-09-03 10:23:25来源&#xff1a;亿速云阅读&#xff1a;96作者&#xff1a;小新小编给大家分享一下python头文件的编程风格&#xff0c;希望大家阅读完这篇文章后大所收获&#xff0c;下面让我们一起去探讨吧&#xff01;本文主…

《Code:The Hidden Language Of Computer Hardware and Software》 ——笔记

怎么由逻辑电路实现二进制的加法 首先二进制的加法可以拆解为两个步骤&#xff1a;加与进位。 加法01001110进位01000101加这一步骤可以由异或门来完成&#xff0c;进位这一步骤则可以用与门来完成。 但是由这两个逻辑门只能组成一个半加器&#xff0c;输入2个值&#xff0c;输…

关于一个域名下如何更换网站

说明&#xff1a;建立在有域名、服务器、两个网站的基础之上。 背景&#xff1a; 原来的网站采用的是微企点建站的方式&#xff0c;对于那种拖拉拽不懂编程的人用的&#xff0c;现在自己开发一个更为强大的功能性网站&#xff0c;想把这个新网站替换掉原来的网站&#xff0c;…

搭建xss-platform平台

这篇更详细&#xff0c;对蓝莲花的XSS有更详细的说明 https://blog.csdn.net/weixin_50464560/article/details/115360092 https://bbs.secgeeker.net/thread-1519-1-1.html 搭建xss-platform平台 一直想搭在公网搭建自己的XSS平台用来验证XSS漏洞&#xff0c;使用别人的平台…

如何获取电脑网站(手机网站)支付宝支付的配置信息(appid、商户私钥、支付宝公钥)

需求:想在网站接入支付宝支付。现在的网站基本分为PC端和手机端。 明确工作目标:appid、商户私钥、支付宝公钥以及回调地址。 电脑PC端支付宝支付获取配置信息步骤如下: 1.登录支付宝开放平台 (传送门),使用企业认证的支付宝账户或者个人认证的支付宝账号扫码登录。…

ubuntu下c 访问mysql_Ubuntu下用C语言访问MySQL数据库

在Ubuntu下费了好长时间终于让C操作MySQL成功了&#xff0c;在此把方法记下来&#xff0c;留着以后用。先安装MySQL 代码: sudo apt-get install mysql在Ubuntu下费了好长时间终于让C操作MySQL成功了&#xff0c;在此把方法记下来&#xff0c;留着以后用。先安装MySQL代码:sudo…

HTML5新增的主体结构元素

article元素section元素nav元素aside元素time元素与微格式pubdate属性 1.article元素 代码片段: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>HTML学习计划</title> </head> …

在Eclipse中使用JUnit4进行单元测试(图文教程一)

在Eclipse中使用JUnit4进行单元测试 单元测试&#xff0c;JUnit4。 这两个有什么关系呢&#xff1f;这就好比&#xff08;草&#xff09;单元测试和&#xff08;割草机&#xff09;。用这个JUnit4工具去辅助我们进行测试。其实不理解这个也没关系&#xff0c;听多了见多了用多了…

Java 9和Project Jigsaw如何破坏您的代码

Java 9迫在眉睫&#xff0c;它将带有完整的Project Jigsaw 。 在我从OpenJFX邮件列表的最近讨论中得知它可能会破坏现有代码之前&#xff0c;我并没有对此给予太多关注。 这对于Java非常不寻常&#xff0c;因此引起了我的兴趣。 我阅读了该项目的JEP和一些相关文章&#xff0c…

mysql 表结构 增删改查_mysql学习【第3篇】:数据库之增删改查操作

注意的几点&#xff1a;1.如果你在cmd中书命令的时候&#xff0c;输入错了就用\c跳出2.\s查看配置信息一、操作文件夹(库)增&#xff1a;create database db1 charset utf8;删&#xff1a;drop database db1;改&#xff1a;alter database db1 charset gbk;查&#xff1a;show …

HTML5的非主体结构元素(header、footer、hgroup、assress)

header元素footer元素hgroup元素address元素网页编排规则 1.header元素 代码演示: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>header元素</title> </head> <body> &l…

DVWA通关教程(上)

简介&#xff1a; DVWA是一款基于PHP和mysql开发的web靶场练习平台&#xff0c;集成了常见的web漏洞如sql注入,xss&#xff0c;密码破解等常见漏洞。本教程将以DVWA为例&#xff0c;演示常见的web漏洞的利用和攻击。 登录创建数据库&#xff08;账号为admin&#xff0c;密码为…

HTML5表单新增元素与属性(form、formaction、formmethod、formenctype、formtarget、autofous、required、labels)

表单内元素的form属性表单内元素的formaction属性​​​​​​​表单内元素的formmethod属性​​​​​​​表单内元素的formenctype属性​​​​​​​表单内元素的formtarget属性​​​​​​​表单内元素的autofous属性​​​​​​​表单内元素的required属性​​​​​​​…