kmeans聚类相信大家都已经很熟悉了。在Python里我们用kmeans通常调用Sklearn包(当然自己写也很简单)。那么在Spark里能不能也直接使用sklean包呢?目前来说直接使用有点困难,不过我看到spark-packages里已经有了,但还没有发布。不过没关系,PySpark里有ml包,除了ml包,还可以使用MLlib,这个在后期会写,也很方便。

  首先来看一下Spark自带的例子

 from pyspark.mllib.linalg import Vectors
from pyspark.ml.clustering import KMeans
from pyspark.sql import SQLContext
from pyspark.mllib.linalg import Vectors
#导入数据
data = [(Vectors.dense([0.0, 0.0]),), (Vectors.dense([1.0, 1.0]),),(Vectors.dense([9.0, 8.0]),), (Vectors.dense([8.0, 9.0]),)]
df = sqlContext.createDataFrame(data, ["features"])
#kmeans模型
kmeans = KMeans(k=2, seed=1)
model = kmeans.fit(df)
#簇心数量
centers = model.clusterCenters()
len(centers)
#
#训练模型
transformed = model.transform(df).select("features", "prediction")
rows = transformed.collect()
rows[0].prediction == rows[1].prediction
#True
rows[2].prediction == rows[3].prediction
# True

  这个例子很简单,导入的数据是四个稠密向量(可以自己在二维向量里画一下),设定了两个簇心,最后验证预测的结果是否正确,显示为True,证明预测正确。算法中具体的参数可以参考API中的说明。然而实际生产中我们的数据集不可能以这样的方式一条条写进去,一般是读取文件,关于怎么读取文件,可以具体看我的这篇博文。这里我们采用iris数据集(不要问我为什么又是iris数据集,因为真的太方便了)来给大家讲解一下。

  

  我的数据集是csv格式的,而Spark又不能直接读取csv格式的数据,这里我们有两个方式,一是我提到的这篇博文里有写怎么读取csv文件,二是安装spark-csv包(在这里下载),github地址在这里。按照步骤安装可以了。这里友情提示一下大家,github的安装方法是:

$SPARK_HOME/bin/spark-shell --packages com.databricks:spark-csv_2.11:1.4.0

  

  如果报错了,可以把 --packages 换成 --jars,如果还是不行,在加一个 common-csv.jars包放到lib下面就可以了。我因为这个耽误了不少时间,不过具体问题也得具体分析。

  安装好这个包以后,就可以读取数据了

  

 from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
data = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('iris.csv')
data.show()

  

  读取数据以后,我们来看一下数据集:

  

 +------+------------+-----------+------------+-----------+-------+
|row.id|Sepal.Length|Sepal.Width|Petal.Length|Petal.Width|Species|
+------+------------+-----------+------------+-----------+-------+
| 1| 5.1| 3.5| 1.4| 0.2| 0|
| 2| 4.9| 3.0| 1.4| 0.2| 0|
| 3| 4.7| 3.2| 1.3| 0.2| 0|
| 4| 4.6| 3.1| 1.5| 0.2| 0|
| 5| 5.0| 3.6| 1.4| 0.2| 0|
| 6| 5.4| 3.9| 1.7| 0.4| 0|
| 7| 4.6| 3.4| 1.4| 0.3| 0|
| 8| 5.0| 3.4| 1.5| 0.2| 0|
| 9| 4.4| 2.9| 1.4| 0.2| 0|
| 10| 4.9| 3.1| 1.5| 0.1| 0|
| 11| 5.4| 3.7| 1.5| 0.2| 0|
| 12| 4.8| 3.4| 1.6| 0.2| 0|
| 13| 4.8| 3.0| 1.4| 0.1| 0|
| 14| 4.3| 3.0| 1.1| 0.1| 0|
| 15| 5.8| 4.0| 1.2| 0.2| 0|
| 16| 5.7| 4.4| 1.5| 0.4| 0|
| 17| 5.4| 3.9| 1.3| 0.4| 0|
| 18| 5.1| 3.5| 1.4| 0.3| 0|
| 19| 5.7| 3.8| 1.7| 0.3| 0|
| 20| 5.1| 3.8| 1.5| 0.3| 0|
+------+------------+-----------+------------+-----------+-------+
only showing top 20 rows

  

  第二步:提取特征

  我们在上一步导入的数据中label是String类型的,但在Spark中要变成数值型才能计算,不然就会报错。可以利用StringIndexer功能将字符串转化为数值型

 from pyspark.ml.feature import StringIndexer

 feature = StringIndexer(inputCol="Species", outputCol="targetlabel")
target = feature.fit(data).transform(data)
target.show()

  targetlabel这一列就是Species转化成数值型的结果

 +------+------------+-----------+------------+-----------+-------+-----------+
|row.id|Sepal.Length|Sepal.Width|Petal.Length|Petal.Width|Species|targetlabel|
+------+------------+-----------+------------+-----------+-------+-----------+
| 1| 5.1| 3.5| 1.4| 0.2| 0| 0.0|
| 2| 4.9| 3.0| 1.4| 0.2| 0| 0.0|
| 3| 4.7| 3.2| 1.3| 0.2| 0| 0.0|
| 4| 4.6| 3.1| 1.5| 0.2| 0| 0.0|
| 5| 5.0| 3.6| 1.4| 0.2| 0| 0.0|
| 6| 5.4| 3.9| 1.7| 0.4| 0| 0.0|
| 7| 4.6| 3.4| 1.4| 0.3| 0| 0.0|
| 8| 5.0| 3.4| 1.5| 0.2| 0| 0.0|
| 9| 4.4| 2.9| 1.4| 0.2| 0| 0.0|
| 10| 4.9| 3.1| 1.5| 0.1| 0| 0.0|
| 11| 5.4| 3.7| 1.5| 0.2| 0| 0.0|
| 12| 4.8| 3.4| 1.6| 0.2| 0| 0.0|
| 13| 4.8| 3.0| 1.4| 0.1| 0| 0.0|
| 14| 4.3| 3.0| 1.1| 0.1| 0| 0.0|
| 15| 5.8| 4.0| 1.2| 0.2| 0| 0.0|
| 16| 5.7| 4.4| 1.5| 0.4| 0| 0.0|
| 17| 5.4| 3.9| 1.3| 0.4| 0| 0.0|
| 18| 5.1| 3.5| 1.4| 0.3| 0| 0.0|
| 19| 5.7| 3.8| 1.7| 0.3| 0| 0.0|
| 20| 5.1| 3.8| 1.5| 0.3| 0| 0.0|
+------+------------+-----------+------------+-----------+-------+-----------+
only showing top 20 rows

  

  最后一步:模型训练和验证

 from pyspark.sql import Row
from pyspark.ml.clustering import KMeans
from pyspark.mllib.linalg import Vectors #把数据格式转化成稠密向量
def transData(row):
return Row(label=row["targetlabel"],
features=Vectors.dense([row["Sepal.Length"],
row["Sepal.Width"],
row["Petal.Length"],
row["Petal.Width"]])) #转化成Dataframe格式
transformed = target.map(transData).toDF()
kmeans = KMeans(k=3)
model = kmeans.fit(transformed) predict_data = model.transform(transformed) train_err = predict_data.filter(predict_data['label'] != predict_data['prediction']).count()
total = predict_data.count()
print traing_err, total, float(train_err)/total

  到这一步就结束了。总结一下,用pyspark做机器学习时,数据格式要转成需要的格式,不然很容易出错。下周写pyspark在机器学习中如何做分类。

【原】Spark之机器学习(Python版)(一)——聚类的更多相关文章

  1. Spark之机器学习(Python版)(一)——聚类

    https://www.cnblogs.com/charlotte77/p/5437611.html

  2. 【原】Spark之机器学习(Python版)(二)——分类

    写这个系列是因为最近公司在搞技术分享,学习Spark,我的任务是讲PySpark的应用,因为我主要用Python,结合Spark,就讲PySpark了.然而我在学习的过程中发现,PySpark很鸡肋( ...

  3. Spark入门(Python版)

    Hadoop是对大数据集进行分布式计算的标准工具,这也是为什么当你穿过机场时能看到”大数据(Big Data)”广告的原因.它已经成为大数据的操作系统,提供了包括工具和技巧在内的丰富生态系统,允许使用 ...

  4. (一)Spark简介-Java&Python版Spark

    Spark简介 视频教程: 1.优酷 2.YouTube 简介: Spark是加州大学伯克利分校AMP实验室,开发的通用内存并行计算框架.Spark在2013年6月进入Apache成为孵化项目,8个月 ...

  5. Spark入门:Spark运行架构(Python版)

    此文为个人学习笔记如需系统学习请访问http://dblab.xmu.edu.cn/blog/1709-2/ 基本概念 *  RDD:是弹性分布式数据集(Resilient Distributed ...

  6. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  7. Python机器学习(1):KMeans聚类

    Python进行KMeans聚类是比较简单的,首先需要import numpy,从sklearn.cluster中import KMeans模块: import numpy as np from sk ...

  8. Spark ML机器学习

    Spark提供了常用机器学习算法的实现, 封装于spark.ml和spark.mllib中. spark.mllib是基于RDD的机器学习库, spark.ml是基于DataFrame的机器学习库. ...

  9. Mac 配置Spark环境scala+python版本(Spark1.6.0)

    1. 从官网下载Spark安装包,解压到自己的安装目录下(默认已经安装好JDK,JDK安装可自行查找): spark官网:http://spark.apache.org/downloads.html ...

随机推荐

  1. 2.C#WinForm基础Email分析器

    功能:输入Email地址,输出用户名和域名 string[] String.split(params char[] separator)(+5重载)) 返回的字符串数组包含此实例的字符串(由指定Uni ...

  2. Spark 入门

    Spark 入门 目录 一. 1. 2. 3. 二. 三. 1. 2. 3. (1) (2) (3) 4. 5. 四. 1. 2. 3. 4. 5. 五.         Spark Shell使用 ...

  3. afxcomctl32.h与afxcomctl32.inl报错

    afxcomctl32.h与afxcomctl32.inl报错 编译公司一个几年前的老项目,是从VC6.0升级到VS2005的. 1.编译时报缺少头文件,于是附件包含目录,于是出现了以下报错: 1&g ...

  4. 03 通过Button打开另一个的frm

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) { DialogResult re = MessageBox ...

  5. jquery遍历table获取td单元格的值

    $("#grd").find("tr").each(function () { //第二列单元格的值eq(索引) alert($(this).children( ...

  6. 获取asp.net服务器控件的客户端ID和Name

    前几天在做项目的时候,遇到一个问题,想查看Asp.net中服务器控件在客户端显示的name属性.起初,感觉不是很难找,但就是找不到,几经周折,终于发现了: string btnClientName = ...

  7. angular2 service component

    [component 需要通过 service 提供的接口 得到一些数据.这是最佳实践.] [由于 有 component 和 service 两个语义,所以出现了下面两种办法] 一,[service ...

  8. 【Spring】SpringMVC入门示例讲解

    目录结构: // contents structure [-] SpringMVC是什么 Spring MVC的设计原理 SpringMVC入门示例 1,复制Jar包 2,Web.xml文件 3,My ...

  9. HTTPS和HTTP的区别

    (转自:http://www.php100.com/html/it/biancheng/2015/0209/8582.html) 总的来说,http效率更高,https安全性更高. 首先谈谈什么是HT ...

  10. Linux下安装JDK和Eclipse

    安装步骤: (1)下载JDK (jdk-8u20-linux-x64.tar.gz) (2)卸载系统自带的开源JDK  rpm  -qa |grep  java rpm  –e   java  (3) ...