Spark作为一种开源集群计算环境,具有分布式的快速数据处理能力。而Spark中的Mllib定义了各种各样用于机器学习的数据结构以及算法。Python具有Spark的API。需要注意的是,Spark中,所有数据的处理都是基于RDD的。

首先举一个聚类方面的详细应用例子Kmeans:

   下面代码是一些基本步骤,包括外部数据,RDD预处理,训练模型,预测。

#coding:utf-8
from numpy import array
from math import sqrt
from pyspark import SparkContext
from pyspark.mllib.clustering import KMeans, KMeansModel if __name__ == "__main__":
sc = SparkContext(appName="KMeansExample",master='local') # SparkContext # 读取并处理数据
data = sc.textFile("./kmeans_data.txt")
print data.collect()
parsedData = data.map(lambda line: array([float(x) for x in line.split(' ')])) # 训练数据
print parsedData.collect()
clusters = KMeans.train(parsedData, k=2, maxIterations=10,
runs=10, initializationMode="random") #求方差之和
def error(point):
center = clusters.centers[clusters.predict(point)]
return sqrt(sum([x**2 for x in (point - center)]))
WSSSE = parsedData.map(lambda point: error(point)).reduce(lambda x, y: x + y) print("Within Set Sum of Squared Error = " + str(WSSSE)) #聚类结果
def sort(point):
return clusters.predict(point)
clusters_result = parsedData.map(sort)
# Save and load model
# $example off$
print '聚类结果:'
print clusters_result.collect()
sc.stop()

可以看到在利用Spark进行机器学习时,我调用了一个外部的开源包numpy,并利用了数组作为数据结构。而在Mllib中其实已经定义了各种用于机器学习的数据结构,下面简单介绍两种在分类和回归分析中可以用到的DS。

稀疏向量(SparseVector):稀疏向量是指向量元素中有许多值是0的向量。

其初始化与简单操作如下:  

# coding:utf-8
from pyspark.mllib.linalg import *
v0 = SparseVector(4, [1, 2], [2, 3.0]) # 稀疏向量,第一个参数为维度,第二个参数是非0维度的下标的集合,第三个参数是非0维度的值的集合
v1 = SparseVector(4,{1: 3, 2: 4}) # 第一个参数是维度,第二个参数是下标和维度组成的字典
print v0.dot(v1) # 计算点积
print v0.size # 向量维度
print v0.norm(0) # 返回维度0的值
print v0.toArray() # 转化为array
print v0.squared_distance(v1) # 欧式距离

  spark中的稀疏向量可以利用list或者dict进行初始化。

向量标签(Labeled  point):向量标签就是在向量和标签的组合,分类和回归中,标签可以作为分类中的类别,也可以作为回归中的实际值。

from pyspark.mllib.regression import LabeledPoint
data = [
LabeledPoint(1.0, [1.0, 1.0]),
LabeledPoint(4.0, [1.0, 3.0]),
LabeledPoint(8.0, [2.0, 3.0]),
LabeledPoint(10.0, [3.0, 4.0])]
print data[0].features
print data[0].label

下面是mllib中用于回归分析的一些基本实现(线性回归,岭回归):

# coding:UTF-8
from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.regression import LinearRegressionWithSGD
from pyspark.context import SparkContext # ----------------线性回归-------------- import numpy as np
sc = SparkContext(master='local',appName='Regression')
data = [
LabeledPoint(1.0, [1.0, 1.0]),
LabeledPoint(2.0, [1.0, 1.4]),
LabeledPoint(4.0, [2.0, 1.9]),
LabeledPoint(6.0, [3.0, 4.0])] # 训练集
lrm = LinearRegressionWithSGD.train(sc.parallelize(data), iterations=100, initialWeights=np.array([1.0,1.0]))
print lrm.predict(np.array([2.0,1.0])) # 利用训练出的回归模型进行预测 import os, tempfile
from pyspark.mllib.regression import LinearRegressionModel
from pyspark.mllib.linalg import SparseVector path = tempfile.mkdtemp()
lrm.save(sc, path) # 将模型保存至外存
sameModel = LinearRegressionModel.load(sc, path) # 读取模型
print sameModel.predict(SparseVector(2, {0: 100.0, 1: 150})) # 利用稀疏向量作为数据结构,返回单个预测值
test_set = []
for i in range(100):
for j in range(100):
test_set.append(SparseVector(2, {0: i,1: j}))
print sameModel.predict(sc.parallelize(test_set)).collect() # 预测多值,返回一个RDD数据集
print sameModel.weights # 返回参数 # -----------------岭回归------------------ from pyspark.mllib.regression import RidgeRegressionWithSGD
data = [
LabeledPoint(1.0, [1.0, 1.0]),
LabeledPoint(4.0, [1.0, 3.0]),
LabeledPoint(8.0, [2.0, 3.0]),
LabeledPoint(10.0, [3.0, 4.0])]
train_set = sc.parallelize(data)
rrm = RidgeRegressionWithSGD.train(train_set, iterations=100, initialWeights=np.array([1.0,1.0]))
test_set = []
for i in range(100):
for j in range(100):
test_set.append(np.array([i, j]))
print rrm.predict(sc.parallelize(test_set)).collect()
print rrm.weights

上述代码只是让大家弄懂一下简单的操作,对于数据的预处理没有在RDD的基础上做。

下面是一些分类算法的基本实现:

# coding:utf-8
from pyspark import SparkContext
from pyspark.mllib.regression import LabeledPoint print '-------逻辑回归-------'
from pyspark.mllib.classification import LogisticRegressionWithSGD
sc = SparkContext(appName="LRWSGD", master='local')
dataset = []
for i in range(100):
for j in range(100):
dataset.append([i,j])
dataset = sc.parallelize(dataset) # 并行化数据,转化为RDD data =[LabeledPoint(0.0, [0.0, 100.0]),LabeledPoint(1.0, [100.0, 0.0]),] lrm = LogisticRegressionWithSGD.train(sc.parallelize(data), iterations=10) # 第二个参数是迭代次数
print lrm.predict(dataset).collect() lrm.clearThreshold()
print lrm.predict([0.0, 1.0])
# ----------------------------------------------------------
from pyspark.mllib.linalg import SparseVector
from numpy import array
sparse_data = [
LabeledPoint(0.0, SparseVector(2, {0: 0.0, 1: 0.0})),
LabeledPoint(1.0, SparseVector(2, {1: 1.0})),
LabeledPoint(0.0, SparseVector(2, {0: 1.0})),
LabeledPoint(1.0, SparseVector(2, {1: 2.0}))
]
train = sc.parallelize(sparse_data)
lrm = LogisticRegressionWithSGD.train(train, iterations=10)
print lrm.predict(array([0.0, 1.0])) # 对单个数组进行预测
print lrm.predict(SparseVector(2, {1: 1.0})) # 对单个稀疏向量进行预测 print '------svm-------' from pyspark.mllib.classification import SVMWithSGD
svm = SVMWithSGD.train(train,iterations=10)
print svm.predict(SparseVector(2, {1: 1.0})) print '------bayes------'
from pyspark.mllib.classification import NaiveBayes
nb = NaiveBayes.train(train)
print nb.predict(SparseVector(2, {1: 1.0}))

版权都是我所有的,(*^__^*) 哈哈哈~

利用Spark-mllab进行聚类,分类,回归分析的代码实现(python)的更多相关文章

  1. 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能. 核心思想 在使用某个特定的算法是, ...

  2. Spark RDD概念学习系列之Spark的算子的分类(十一)

    Spark的算子的分类 从大方向来说,Spark 算子大致可以分为以下两类: 1)Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理. Transformat ...

  3. 基于Spark Mllib的文本分类

    基于Spark Mllib的文本分类 文本分类是一个典型的机器学习问题,其主要目标是通过对已有语料库文本数据训练得到分类模型,进而对新文本进行类别标签的预测.这在很多领域都有现实的应用场景,如新闻网站 ...

  4. 【转载】 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

    原文地址: https://www.cnblogs.com/steven-yang/p/5686473.html ------------------------------------------- ...

  5. NLP(二十二)利用ALBERT实现文本二分类

      在文章NLP(二十)利用BERT实现文本二分类中,笔者介绍了如何使用BERT来实现文本二分类功能,以判别是否属于出访类事件为例子.但是呢,利用BERT在做模型预测的时候存在预测时间较长的问题.因此 ...

  6. 利用RNN进行中文文本分类(数据集是复旦中文语料)

    利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料) 1.训练词向量 数据预处理参考利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料) ,现在我们有了分词 ...

  7. 利用CNN进行中文文本分类(数据集是复旦中文语料)

    利用TfidfVectorizer进行中文文本分类(数据集是复旦中文语料) 利用RNN进行中文文本分类(数据集是复旦中文语料) 上一节我们利用了RNN(GRU)对中文文本进行了分类,本节我们将继续使用 ...

  8. ES6新特性:利用解构赋值 (destructuring assignment), 简化代码

    本文的Demo的运行环境为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用 : 解构赋值是一种表达式, 利用这种新语法, 可以直接从数组或者对象中快速提取值 赋值给不 ...

  9. 利用strut2标签自动生成form前端验证代码

    利用strut2标签自动生成form前端验证代码,使用到的技术有1.struts2标签,如<s:form> <s:textfieled>2.struts2读取*Validati ...

随机推荐

  1. 复分析可视化方法:笔记:log(z)的可视化微分法

    当z转过θ时,我们来看看发生了什么: 左图中的空心箭头代表z的变化量,其长度为rδ,方向为pi/2+θ: 右图中的实心箭头代表log(z)的变化量,其长度为δ,方向为pi/2. 因此,从左图空心箭头到 ...

  2. bzoj1876 SuperGCD

    Description Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比赛计算GCD.有一天Sheng bill很嚣张地找到了你,并要 ...

  3. windows git 清除已保存的密码

    进入git目录 右键 git-bash.exe 执行命令: git config --system --unset credential.helper 然后执行git clone http://... ...

  4. maven学习(5)-Maven 聚合与继承特性

    接着上面的项目, 继承和聚合为了统一管理: 聚合: 有些项目中有很多小模块,可以合并到一起,将多个子项目可以统一管理,可以对user-dao,user-service进行统一管理(maven clea ...

  5. LDA-MySql

    http://blog.csdn.net/white_smile/article/details/19565701

  6. win2003 server的域用户加入本地管理员组

    很久没有搞windows的域管理,今天碰到一个问题,一直找不到解决方法,一直在网络找资料,直到刚刚才找到方法,方法如下: C:\>net localgroup administrators li ...

  7. iOS 基础

    layoutSubviews: layoutSubviews是对sbuviews的重新布局,比如,我们想更新子视图的位置,可以通过调用layoutSubviews方法(不能直接调用) layoutSu ...

  8. SVM的sklearn.svm.SVC实现与类参数

    SVC继承了父类BaseSVC SVC类主要方法: ★__init__() 主要参数: C: float参数 默认值为1.0 错误项的惩罚系数.C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确 ...

  9. HTML5须知的特征和技术

    1.新的Doctype XHTML文档类型 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  10. 生产者消费者模型(Queue,JoinableQueue)

    生产者消费者模型 主要是为解耦 借助队列来实现生产者消费者模型 栈:先进后出(First In Last Out 简称 FILO) 队列: 先进先出(First In First Out 简称 FIF ...