地铁译:Spark for python developers ---Spark与数据的机器学习

RDD Pipeline 源码图解 在面试候选人Spark相关知识点时, 我总喜欢问这么一个问题:       如果一个源数据有1亿行, 对这个源数据分别做map()操作和flatMap()操作, 过程是下面描述的那种流程, 为什么?         1 每读1条数据, 顺次执行map()和flatMap(), 再读取下一条;         2 对1亿条数据遍历做完map()后, 然后再重新读取一遍这1亿条数据, 做flat 阅读详情

机器学习可以从数据中得到有用的见解. 目标是纵观Spark MLlib,采用合适的算法从数据集中生成见解。对于 Twitter的数据集, 采用非监督集群算法来区分与Apache
Spark相关的tweets . 初始输入是混合在一起的tweets。 首先提取相关特性, 然后在数据集中使用机器学习算法 , 最后评估结果和性能.


本章重点如下:


•了解 Spark MLlib 模块及其算法,还有典型的机器学习流程 .



• 预处理 所采集的Twitter 数据集提取相关特性, 应用非监督集群算法识别Apache Spark-
相关的tweets. 然后, 评估得到的模型和结果.




• 描述Spark 机器学习的流水线.






Spark MLlib 在应用架构中的位置

先看一下数据学习在数据密集型应用架构中的位置,集中关注分析层,准确一点说是机器学习。这是批处理和流处理数据学习的基础,它们只是推测的规则不同。


下图指出了重点, 分析层处理的探索式数据分析工具 Spark SQL和Pandas外 还有机器学习模块.


4-1 Spark MLlib 在架构中的位置



Spark MLlib 算法分类

Spark MLlib 是一个更新很快的模块,新的算法不断地引入到 Spark中.

下图提供了 Spark MLlib 算法的高层通览,并根据传统机器学习技术的体系或数据的连续性进行了分组:

4-2 Spark MLlib 算法分类

根据数据的类型,将 Spark MLlib 算法分成两栏, 性质无序或者数量连续的 . 我们将数据区分为无序的性质数据和数量连续的数据。一个性质数据的例子:在给定大气压,温度,云的类型和呈现, 天气是晴朗,干燥,多雨,或者阴天时
时,预测她是否穿着男性上装,这是离散的值。 另一方面, 给定了位置,住房面积,房间数,想预测房屋的价格 , 房地产可以通过线性回归预测。 
本例中,讨论数量连续的数据。

水平分组反映了所使用的机器学习算法的类型。监督和非监督机器学习取决于训练的数据是否标注。非监督学习的挑战是对非标注数据使用学习算法。目标是发现输入中隐含的结构。
而监督式学习的数据是标注过的。 重点是对连续数据的回归预测以及离散数据的分类.


机器学习的一个重要门类是推荐系统,主要是利用了协同过滤技术。 Amazon 和 Netflix 有自己非常强大的 推荐系统.

 随机梯度下降是适合于Spark分布计算的机器学习优化技术之一。对于处理大量的文本,Spark提供了特性提取和转换的重要的库例如: TF-IDF , Word2Vec, standard scaler, 和normalizer.



监督和非监督式学习

深入研究一下Spark MLlib 提供的传统的机器学习算法 . 监督和非监督机器学习取决于训练的数据是否标注. 区别无序和连续取决于数据的离散或连续.
下图解释了 Spark MLlib 监督和非监督时算法及预处理技术 :
4-3 监督和非监督式学习

下面时Spakr MLlib中的监督和非监督算法以及与预处理技术:

• Clustering 聚类: 一个非监督式机器学习技术,数据是没有标注的,目的是数据中提取结构:





∞ K-Means:  从 K个不同聚类中进行数据分片


∞ Gaussian  Mixture: 基于组件的最大化后验概率聚类  



∞ Power Iteration Clustering(PIC): 根据图顶点的两两边的相似程度聚类




∞ Latent  Dirichlet  Allocation  (LDA):  用于将文本文档聚类成话题 




∞ Streaming  K-Means:  使用窗口函数将进入的数据流动态的进行K-Means聚类


• Dimensionality Reduction: 目的在减少特性的数量. 基本上, 用于削减数据噪音并关注关键特性:


∞ Singular  Value  Decomposition  (SVD):  将矩阵中的数据分割成简单的有意义的小片,把初始矩阵生成3个矩阵.
∞ Principal  Component  Analysis  (PCA):  以子空间的低维数据逼近高维数据集..

• Regression and Classification: 当分类器将结果分成类时,回归使用标注过的训练数据来预测输出结果。分类的变量是离散无序的,回归的变量是连续而有序的
:


∞ Linear  Regression  Models  (linear  regression,  logistic  regression,
and  support  vector  machines): 线性回归算法可以表达为凸优化问题,目的是基于有权重变量的向量使目标函数最小化.  目标函数通过函数的正则部分控制函数的复杂性,通过函数的损失部分控制函数的误差.

∞ Naive  Bayes: 基于给定标签的条件概率来预测,基本假设是变量的相互独立性。

∞ Decision  Trees:  它执行了特性空间的递归二元划分,为了最好的划分分割需要将树状节点的信息增益最大化。 


∞ Ensembles  of  trees  (Random  Forests  and  Gradient-Boosted  Trees):
树集成算法结合了多种决策树模型来构建一个高性能的模型,它们对分类和回归是非常直观和成功的。


• Isotonic Regression保序回归: 最小化所给数据和可观测响应的均方根误差.

其他学习算法


Spark MLlib 还提供了很多其它的算法,广泛地说有三种其它的机器学习算法:
推荐系统, 优化算法, 和特征提取.

4-4 Spark MLlib 中的其他算法

下面当前是 MLlib 中的其它算法:

• Collaborative filtering: 是推荐系统的基础,创建用户-物品关联矩阵,目标是填充差异。基于其它用户与物品的关联评分,为没有评分的目标用户推荐物品。在分布式计算中, ALS (Alternating Least Square)是最成功的算法之一:



∞ Alternating  Least  Squares交替最小二乘法:  矩阵分解技术采用了隐性反馈,时间效应和置信水平,把大规模的用户物品矩阵分解成低维的用户物品因子,通过替换因子最小化二次损失函数。



• Feature extraction and transformation: 这些是大规模文档处理的基础,包括如下技术:

∞ Term  Frequency:  搜素引擎使用Search  engines  use  TF-IDF 对语料库中的文档进行等级评分。机器学习中用它来判断一个词在文档或语料库中的重要性.  词频统计所确定的权重取决于它在语料库中出现的频率。 词频本身可能存在错误导向比如过分强调了类似 the,  of,  or  and  等这样无意义的信息词汇.  逆文档频率提供了特异性或者信息量的度量,词汇在语料库中所有文档是否常见。  
∞ Word2Vec:  包括了两个模型 Skip-Gram 和Continuous
 Bag  of  Word.  Skip-Gram  预测了一个给定词汇的邻近词,  基于词汇的滑动窗口; Continuous  Bag  of
Words 预测了所给定邻近词汇的当前词是什么.  

∞ Standard  Scaler:  作为预处理的一部分,数据集经常通过平均去除和方差缩放来标准化.  我们在训练数据上计算平均和标准偏差,并应用同样的变形来测试数据.  


∞ Normalizer:  在缩放样本时需要规范化. 对于点积或核心方法这样的二次型非常有用。  

∞ Feature  selection: 通过选择模型中最相关的特征来降低向量空间的维度。  


∞ Chi-Square  Selector:  一个统计方法来测量两个事件的独立性。

• Optimization: 这些 Spark MLlib 优化算法聚焦在各种梯度下降的技术。 Spark 在分布式集群上提供了非常有效的梯度下降的实现,通过本地极小的迭代完成梯度的快速下降。迭代所有的数据变量是计算密集型的:


∞ Stochastic  Gradient  Descent:  最小化目标函数即
微分函数的和.  随机梯度下降仅使用了一个训练数据的抽样来更新一个特殊迭代的参数,用来解决大规模稀疏机器学习问题例如文本分类.


• Limited-memory BFGS (L-BFGS): 文如其名,L-BFGS使用了有限内存,适合于Spark MLlib 实现的分布式优化算法。


Spark MLlib data types


MLlib 支持4种数据类型: local vector, labeled point, local matrix,
and distributed matrix. Spark MLlib 算法广泛地使用了这些数据类型:


• Local vector: 位于单机,可以是紧密或稀疏的:




∞ Dense  vector 是传统的 doubles 数组.  例如[5.0,  0.0,  1.0,  7.0].



∞ Sparse  vector  使用整数和double值.  稀疏向量  [5.0,  0.0,  1.0,  7.0]  应该是 (4,
[0,  2,  3],  [5.0,  1.0,  7.0]),表明了向量的维数.

这是 PySpark中一个使用本地向量的例子:

import  numpy  as  np
import  scipy.sparse  as  sps
from  pyspark.mllib.linalg  import  Vectors

#  NumPy  array  for  dense  vector.
dvect1  =  np.array([5.0,  0.0,  1.0,  7.0])
#  Python  list  for  dense  vector.
dvect2  =  [5.0,  0.0,  1.0,  7.0]
#  SparseVector  creation
svect1  =  Vectors.sparse(4,  [0,  2,  3],  [5.0,  1.0,  7.0])
#  Sparse  vector  using  a  single-column  SciPy  csc_matrix
svect2  =  sps.csc_matrix((np.array([5.0,  1.0,  7.0]),  np.array([0,
2,  3])),  shape  =  (4,  1))

• Labeled point. 一个标注点是监督式学习中的一个有标签的紧密或稀疏向量. 在二元标签中, 0.0 代表负值, 1.0 代表正值.


这有一个PySpark中标注点的例子:

from  pyspark.mllib.linalg  import  SparseVector
from  pyspark.mllib.regression  import  LabeledPoint

#  Labeled point with a positive label and a dense feature  vector.
lp_pos  =  LabeledPoint(1.0,  [5.0,  0.0,  1.0,  7.0])

#  Labeled  point  with  a  negative  label  and  a  sparse  feature  vector.
lp_neg  =  LabeledPoint(0.0,  SparseVector(4,  [0,  2,  3],  [5.0,  1.0,
7.0]))

• Local Matrix: 本地矩阵位于单机上,拥有整型索引和double的值.
这是一个 PySpark中本地矩阵的例子:

from  pyspark.mllib.linalg  import  Matrix,  Matrices

#  Dense  matrix  ((1.0,  2.0,  3.0),  (4.0,  5.0,  6.0))
dMatrix  =  Matrices.dense(2,  3,  [1,  2,  3,  4,  5,  6])

#  Sparse  matrix  ((9.0,  0.0),  (0.0,  8.0),  (0.0,  6.0))
sMatrix  =  Matrices.sparse(3,  2,  [0,  1,  3],  [0,  2,  1],  [9,  6,  8])

• Distributed Matrix: 充分利用 RDD的成熟性,分布式矩阵可以在集群中共享
. 有4种分布式矩阵类型: RowMatrix, IndexedRowMatrix,
CoordinateMatrix, 和 BlockMatrix:


∞ RowMatrix:  使用多个向量的一个  RDD,创建无意义索引的行分布式矩阵叫做  RowMatrix.  


∞ IndexedRowMatrix:  行索引是有意义的. 首先使用IndexedRow 类创建一个 带索引行的RDDFirst,
再创建一个 IndexedRowMatrix.  



∞ CoordinateMatrix:  对于表达巨大而稀疏的矩阵非常有用。CoordinateMatrix 从MatrixEntry的RDD创建,用类型元组   (long,  long,  or float)来表示。  




∞ BlockMatrix:  从 子矩阵块的RDDs创建,
子矩阵块形如 ((blockRowIndex,  blockColIndex),
sub-matrix).


机器学习的工作流和数据流




除了算法, 机器学习还需要处理过程,我们将讨论监督和非监督学习的典型流程和数据流.



监督式学习工作流程

在监督式学习中, 输入的训练数据集是标注过的. 一个重要的话数据实践是分割输入来训练和测试, 以及严重相应的模式.完成监督式学习有6个步骤:

• Collect the data: 这个步骤依赖于前面的章节,保证数据正确的容量和颗粒度,使机器学习算法能够提供可靠的答案.

• Preprocess the data: 通过抽样检查数据质量,添补遗漏的数据值,缩放和规范化数据。同时,定义特征提取处理。典型地,在大文本数据集中,分词,移除停词,词干提取 和 TF-IDF. 在监督式学习中,分别将数据放入训练和测试集。我门也实现了抽样的各种策略, 为交叉检验分割数据集。

• Ready the data: 准备格式化的数据和算法所需的数据类型。在 Spark MLlib中, 包括 local vector, dense 或 sparse vectors, labeled points, local matrix, distributed matrix with row matrix, indexed row matrix, coordinate matrix, 和 block matrix.


• Model: 针对问题使用算法以及获得最适合算法的评估结果,可能有多种算法适合同一问题; 它们的性能存储在评估步骤中以便选择性能最好的一个。 我门可以实现一个综合方案或者模型组合来得到最好的结果。


• Optimize: 为了一些算法的参数优化,需要运行网格搜索。这些9参数取决于训练,测试和产品调优的阶段。
• Evaluate: 最终给模型打分,并综合准确率,性能,可靠性,伸缩性 选择最好的一个模型。 用性能最好的模型来测试数据来探明模型预测的准确性。一旦对调优模型满意,就可以到生产环境处理真正的数据了 .


监督式机器学习的工作流程和数据流如下图所示:



4-5 监督式学习工作流程





非监督式学习工作流程



与监督式学习相对,非监督式学习的初始数据使没有标注的,这是真实生活的情形。通过聚类或降维算法提取数据中的结构, 在非监督式学习中,不用分割数据到训练和测试中,因为数据没有标注,我们不能做任何预测。训练数据的6个步骤与监督式学习中的那些步骤相似。一旦模型训练过了,将评估结果和调优模型,然后发布到生产环境。

非监督式学习是监督式学习的初始步骤。 也即是说, 数据降维先于进入学习阶段。

非监督式机器学习的工作流程和数据流表达如下:
4-6 非监督式学习工作流程

Twitter 数据集聚类

感受一下从Twitter提取到的数据,理解数据结构,然后运行 K-Means 聚类算法 . 使用非监督式的处理和数据流程,步骤如下:

1. 组合所有的 tweet文件成一个 dataframe.
2. 
解析 tweets, 移除停词,提取表情符号,提取URL, 并最终规范化词 (如,转化为小写,移除标点符号和数字).
3. 特征提取包括以下步骤:


∞ Tokenization:  将tweet的文本解析成单个的单词或tokens  


∞ TF-IDF:  应用 TF-IDF  算法从文本分词中创建特征向量  



∞ Hash  TF-IDF:  应用哈希函数的TF-IDF


4.运行 K-Means 聚类算法.

5.评估 K-Means聚类的结果:


∞ 界定 tweet 的成员关系 和聚类结果  

∞ 通过多维缩放和PCA算法执行降维分析到两维


∞ 绘制聚类


6.流水线:


∞ 调优相关聚类K值数目

∞ 测量模型成本

∞ 选择优化的模型

在 Twitter数据集上应用Scikit-Learn

Python 有自己的 Scikit-Learn 机器学习库,是最可靠直观和健壮的工具之一 。 使用Pandas 和 Scikit-Learn运行预处理和非监督式学习。 在用Spark MLlib 完成聚类之前,使用Scikit-Learn来探索数据的抽样是非常有益的。这里混合了
7,540 tweets, 它包含了与Apache Spark,Python相关的tweets, 即将到来的总统选举: 希拉里克林顿 和 唐纳德 ,一些时尚相关的 tweets , Lady Gaga 和Justin Bieber的音乐. 在Twitter 数据集上使用
Scikit-Learn 并运行K-Means 聚类算法。

先将样本数据加载到 一个 Pandas dataframe:


import  pandas  as  pd

csv_in  =  'C:\\Users\\Amit\\Documents\\IPython  Notebooks\\AN00_Data\\
unq_tweetstxt.csv'

twts_df01  =  pd.read_csv(csv_in,  sep  =';',  encoding='utf-8')

In  [24]:
csv(csv_in,  sep  =';',  encoding='utf-8')
In  [24]:

twts_df01.count()
Out[24]:
Unnamed:  0 7540
id  7540
created_at  7540
user_id 7540
user_name   7538
tweet_text  7540
dtype:  int64

#
#  Introspecting  the  tweets  text
#
In  [82]:

twtstxt_ls01[6910:6920]
Out[82]:
['RT  @deroach_Ismoke:  I  am  NOT  voting  for  #hilaryclinton  http://t.co/jaZZpcHkkJ',
'RT  @AnimalRightsJen:  #HilaryClinton  What  do  Bernie  Sanders  and Donald  Trump  Have  in  Common?:  He  has  so  far  been  th...  http://t.co/t2YRcGCh6…',
'I  understand  why  Bill  was  out  banging  other  chicks.......      I mean
look  at  what  he  is  married  to.....\n@HilaryClinton',
'#HilaryClinton  What  do  Bernie  Sanders  and  Donald  Trump  Have  in Common?:  He  has  so  far  been  th...  http://t.co/t2YRcGCh67  #Tcot #UniteBlue']

先从Tweets 的文本中做一个特征提取,使用一个有10000特征和英文停词的TF-IDF 矢量器将数据集向量化:

In  [37]:

print("Extracting  features  from  the  training  dataset  using  a  sparse vectorizer")
t0  =  time()
Extracting  features  from  the  training  dataset  using  a  sparse
vectorizer
In  [38]:

vectorizer  =  TfidfVectorizer(max_df=0.5,  max_features=10000,
min_df=2,  stop_words='english',use_idf=True)
X  =  vectorizer.fit_transform(twtstxt_ls01)
#
#  Output  of  the  TFIDF  Feature  vectorizer
#
print("done  in  %fs"  %  (time()  -  t0))
print("n_samples:  %d,  n_features:  %d"  %  X.shape)
print()
done  in  5.232165s
n_samples:  7540,  n_features:  6638

数据集被分成拥有6638特征的7540个抽样, 形成稀疏矩阵给 K-Means 聚类算法 ,初始选择7个聚类和最多100次迭代:

In  [47]:

km  =  KMeans(n_clusters=7,  init='k-means++',  max_iter=100,  n_init=1,
verbose=1)

print("Clustering  sparse  data  with  %s"  %  km)
t0  =  time()
km.fit(X)
print("done  in  %0.3fs"  %  (time()  -  t0))

Clustering  sparse  data  with  KMeans(copy_x=True,  init='k-means++',  max_iter=100,  n_clusters=7,  n_init=1,
n_jobs=1,  precompute_distances='auto',  random_state=None,
tol=0.0001,verbose=1)
Initialization  complete
Iteration   0,  inertia  13635.141
Iteration   1,  inertia  6943.485
Iteration   2,  inertia  6924.093
Iteration   3,  inertia  6915.004
Iteration   4,  inertia  6909.212
Iteration   5,  inertia  6903.848
Iteration   6,  inertia  6888.606
Iteration   7,  inertia  6863.226
Iteration   8,  inertia  6860.026
Iteration   9,  inertia  6859.338
Iteration  10,  inertia  6859.213
Iteration  11,  inertia  6859.102
Iteration  12,  inertia  6859.080
Iteration  13,  inertia  6859.060
Iteration  14,  inertia  6859.047
Iteration  15,  inertia  6859.039
Iteration  16,  inertia  6859.032
Iteration  17,  inertia  6859.031
Iteration  18,  inertia  6859.029
Converged  at  iteration  18
done  in  1.701s

在18次迭代后 K-Means聚类算法收敛,根据相应的关键词看一下7个聚类的结果 . Clusters 0 和6 是关于音乐和时尚的 Justin Bieber 和Lady Gaga 相关的tweets.
Clusters 1 和5 是与美国总统大选 Donald Trump和 Hilary Clinton相关的tweets. Clusters 2 和3 是我们感兴趣的Apache Spark 和Python. Cluster 4 包含了 Thailand相关的 tweets:

#
#  Introspect  top  terms  per  cluster
#

In  [49]:

print("Top  terms  per  cluster:")
order_centroids  =  km.cluster_centers_.argsort()[:,  ::-1]
terms  =  vectorizer.get_feature_names()
for  i  in  range(7):
    print("Cluster  %d:"  %  i,  end='')
    for  ind  in  order_centroids[i,  :20]:
        print('  %s'  %  terms[ind],  end='')
        print()

Top  terms  per  cluster:
Cluster  0:  justinbieber  love  mean  rt  follow  thank  hi https
whatdoyoumean  video  wanna  hear  whatdoyoumeanviral  rorykramer  happy  lol making  person  dream  justin
Cluster  1:  donaldtrump  hilaryclinton  rt  https  trump2016
realdonaldtrump  trump  gop  amp  justinbieber  president  clinton  emails oy8ltkstze  tcot  like  berniesanders  hilary  people  email
Cluster  2:  bigdata  apachespark  hadoop  analytics  rt  spark  training chennai  ibm  datascience  apache  processing  cloudera  mapreduce  data  sap https  vora  transforming  development
Cluster  3:  apachespark  python  https  rt  spark  data  amp  databricks  using new  learn  hadoop  ibm  big  apache  continuumio  bluemix  learning  join  open
Cluster  4:  ernestsgantt  simbata3  jdhm2015  elsahel12  phuketdailynews dreamintentions  beyhiveinfrance  almtorta18  civipartnership  9_a_6
25whu72ep0  k7erhvu7wn  fdmxxxcm3h  osxuh2fxnt  5o5rmb0xhp  jnbgkqn0dj ovap57ujdh  dtzsz3lb6x  sunnysai12345  sdcvulih6g
Cluster  5:  trump  donald  donaldtrump  starbucks  trumpquote
trumpforpresident  oy8ltkstze  https  zfns7pxysx  silly  goy  stump trump2016  news  jeremy  coffee  corbyn  ok7vc8aetz  rt  tonight
Cluster  6:  ladygaga  gaga  lady  rt  https  love  follow  horror  cd  story ahshotel  american  japan  hotel  human  trafficking  music  fashion  diet queen  ahs

我们将通过画图来可视化结果。由于我们有6638个特征的7540个抽样,很难多维可视化,所以通过MDS算法来降维描绘 :

import  matplotlib.pyplot  as  plt
import  matplotlib  as  mpl
from  sklearn.manifold  import  MDS

MDS()

#
#  Bring  down  the  MDS  to  two  dimensions  (components)  as  we  will  plot the  clusters
#
mds  =  MDS(n_components=2,  dissimilarity="precomputed",  random_state=1)

pos  =  mds.fit_transform(dist) #  shape  (n_components,  n_samples)

xs,  ys  =  pos[:,  0],  pos[:,  1]

In  [67]:

#
#  Set  up  colors  per  clusters  using  a  dict
#
cluster_colors  =  {0:  '#1b9e77',  1:  '#d95f02',  2: '#7570b3',  3:'#e7298a',  4:  '#66a61e',  5:  '#9990b3',  6:  '#e8888a'}

#
#set  up  cluster  names  using  a  dict
#
cluster_names  =  {0:  'Music,  Pop',
1:  'USA  Politics,  Election',
2:  'BigData,  Spark',
3:  'Spark,  Python',
4:  'Thailand',
5:  'USA  Politics,  Election',
6:  'Music,  Pop'}
In  [115]:
#
#  ipython  magic  to  show  the  matplotlib  plots  inline
#
%matplotlib  inline

#
#  Create  data  frame  which  includes  MDS  results,  cluster  numbers  and
tweet  texts  to  be  displayed
#
df  =  pd.DataFrame(dict(x=xs,  y=ys,  label=clusters,  txt=twtstxt_ls02_
utf8))
ix_start  =  2000
ix_stop =  2050
df01  =  df[ix_start:ix_stop]

print(df01[['label','txt']])
print(len(df01))
print()

#  Group  by  cluster

groups  =  df.groupby('label')
groups01  =  df01.groupby('label')

#  Set  up  the  plot

fig,  ax  =  plt.subplots(figsize=(17,  10))
ax.margins(0.05)

#
#  Build  the  plot  object
#
for  name,  group  in  groups01:
ax.plot(group.x,  group.y,  marker='o',  linestyle='',  ms=12,
label=cluster_names[name],  color=cluster_colors[name],
mec='none')
ax.set_aspect('auto')
ax.tick_params(\
axis=  'x', #  settings  for  x-axis
which='both',   #
bottom='off',   #
top='off',  #
labelbottom='off')
ax.tick_params(\
axis=  'y', #  settings  for  y-axis
which='both',   #
left='off', #
top='off',  #
labelleft='off')

ax.legend(numpoints=1)  #
#
#  Add  label  in  x,y  position  with  tweet  text
#
for  i  in  range(ix_start,  ix_stop):
ax.text(df01.ix[i]['x'],  df01.ix[i]['y'],  df01.ix[i]['txt'],
size=10)

plt.show()  #  Display  the  plot


label   text
2000    2   b'RT  @BigDataTechCon:  '
2001    3   b"@4Quant  's  presentat"
2002    2   b'Cassandra  Summit  201'

这是Cluster 2的图, 由蓝点表示Big Data 和 Spark; Cluster 3, 由红点表示Spark 和Python,以及相关的 tweets 内容抽样 :

4-7 tweet 聚类

利用 Scikit-Learn 的处理结果,已经探索到数据的一些好的见解,现在关注在Twitter数据集上执行 Spark MLlib。

预处理数据集

为了准备在数据集上运行聚类算法,现在聚焦特征提取和工程化。我们实例化Spark Context,读取 Twitter 数据集到一个 Spark dataframe. 然后,对tweet文本数据连续分词,应用哈希词频算法到 tokens, 并最终应用 Inverse Document Frequency 算法,重新缩放数据 。代码如下:

In  [3]:
#
#  Read  csv  in  a  Panda  DF
#
#
import  pandas  as  pd
csv_in  =  '/home/an/spark/spark-1.5.0-bin-hadoop2.6/examples/AN_Spark/data/unq_tweetstxt.csv'
pddf_in  =  pd.read_csv(csv_in,  index_col=None,  header=0,  sep=';',encoding='utf-8')

In  [4]:

sqlContext  =  SQLContext(sc)

In  [5]:

#
#  Convert  a  Panda  DF  to  a  Spark  DF
#

spdf_02  =  sqlContext.createDataFrame(pddf_in[['id',  'user_id',  'user_name',  'tweet_text']])

In  [8]:

spdf_02.show()

In  [7]: 
spdf_02.take(3)

Out[7]:

[Row(id=638830426971181057,  user_id=3276255125,  user_name=u'True Equality',  tweet_text=u'ernestsgantt:  BeyHiveInFrance:  9_A_6:dreamintentions:  elsahel12:  simbata3:  JDHM2015:  almtorta18:dreamintentions:\u2026  http://t.co/VpD7FoqMr0'),
Row(id=638830426727911424,  user_id=3276255125,  user_name=u'True
Equality',  tweet_text=u'ernestsgantt:  BeyHiveInFrance:
PhuketDailyNews:  dreamintentions:  elsahel12:  simbata3:  JDHM2015:almtorta18:  CiviPa\u2026  http://t.co/VpD7FoqMr0'),
Row(id=638830425402556417,  user_id=3276255125,  user_name=u'True
Equality',  tweet_text=u'ernestsgantt:  BeyHiveInFrance:  9_A_6:
ernestsgantt:  elsahel12:  simbata3:  JDHM2015:  almtorta18:
CiviPartnership:  dr\u2026  http://t.co/EMDOn8chPK')]

In  [9]:

from  pyspark.ml.feature  import  HashingTF,  IDF,  Tokenizer

In  [10]:

#
#  Tokenize  the  tweet_text
#
tokenizer  =  Tokenizer(inputCol="tweet_text",outputCol="tokens")
tokensData  =  tokenizer.transform(spdf_02)

In  [11]:

tokensData.take(1)

Out[11]:

[Row(id=638830426971181057,  user_id=3276255125,  user_name=u'True Equality',  tweet_text=u'ernestsgantt:  BeyHiveInFrance:9_A_6:  dreamintentions:  elsahel12:  simbata3:  JDHM2015:almtorta18:  dreamintentions:\u2026  http://t.co/VpD7FoqMr0',
tokens=[u'ernestsgantt:',  u'beyhiveinfrance:',  u'9_a_6:',
u'dreamintentions:',  u'elsahel12:',  u'simbata3:',  u'jdhm2015:',u'almtorta18:',  u'dreamintentions:\u2026',  u'http://t.co/vpd7foqmr0'])]

In  [14]:
#
#  Apply  Hashing  TF  to  the  tokens
#
hashingTF  =  HashingTF(inputCol="tokens", outputCol="rawFeatures",numFeatures=2000)
featuresData  =  hashingTF.transform(tokensData)

In  [15]:

featuresData.take(1)

Out[15]:

[Row(id=638830426971181057,  user_id=3276255125,  user_name=u'True Equality',  tweet_text=u'ernestsgantt:  BeyHiveInFrance:9_A_6:  dreamintentions:  elsahel12:  simbata3:  JDHM2015:almtorta18:  dreamintentions:\u2026  http://t.co/VpD7FoqMr0',
tokens=[u'ernestsgantt:',  u'beyhiveinfrance:',  u'9_a_6:',
u'dreamintentions:',  u'elsahel12:',  u'simbata3:',  u'jdhm2015:',u'almtorta18:',  u'dreamintentions:\u2026',  u'http://t.co/vpd7foqmr0'],
rawFeatures=SparseVector(2000,  {74:  1.0,  97:  1.0,  100:  1.0,  160:  1.0,185:  1.0,  742:  1.0,  856:  1.0,  991:  1.0,  1383:  1.0,  1620:  1.0}))]

In  [16]:

#
#  Apply  IDF  to  the  raw  features  and  rescale  the  data
#
idf  =  IDF(inputCol="rawFeatures",  outputCol="features")
idfModel  =  idf.fit(featuresData)
rescaledData  =  idfModel.transform(featuresData)

for  features  in  rescaledData.select("features").take(3):
    print(features)

In  [17]:

rescaledData.take(2)

Out[17]:

[Row(id=638830426971181057,  user_id=3276255125,  user_name=u'True Equality',  tweet_text=u'ernestsgantt:  BeyHiveInFrance:9_A_6:  dreamintentions:  elsahel12:  simbata3:  JDHM2015:almtorta18:  dreamintentions:\u2026  http://t.co/VpD7FoqMr0',
tokens=[u'ernestsgantt:',  u'beyhiveinfrance:',  u'9_a_6:',
u'dreamintentions:',  u'elsahel12:',  u'simbata3:',  u'jdhm2015:',u'almtorta18:',  u'dreamintentions:\u2026',  u'http://t.co/vpd7foqmr0'],
rawFeatures=SparseVector(2000,  {74:  1.0,  97:  1.0,  100:  1.0,  160:1.0,  185:  1.0,  742:  1.0,  856:  1.0,  991:  1.0,  1383:  1.0,  1620:  1.0}),
features=SparseVector(2000,  {74:  2.6762,  97:  1.8625,  100:  2.6384,  160:2.9985,  185:  2.7481,  742:  5.5269,  856:  4.1406,  991:  2.9518,  1383:4.694,  1620:  3.073})),
Row(id=638830426727911424,  user_id=3276255125,  user_name=u'True
Equality',  tweet_text=u'ernestsgantt:  BeyHiveInFrance:
PhuketDailyNews:  dreamintentions:  elsahel12:  simbata3:
JDHM2015:  almtorta18:  CiviPa\u2026  http://t.co/VpD7FoqMr0',
tokens=[u'ernestsgantt:',  u'beyhiveinfrance:',  u'phuketdailynews:',u'dreamintentions:',  u'elsahel12:',  u'simbata3:',  u'jdhm2015:',u'almtorta18:',  u'civipa\u2026',  u'http://t.co/vpd7foqmr0'],
rawFeatures=SparseVector(2000,  {74:  1.0,  97:  1.0,  100:  1.0,  160:1.0,  185:  1.0,  460:  1.0,  987:  1.0,  991:  1.0,  1383:  1.0,  1620:  1.0}),
features=SparseVector(2000,  {74:  2.6762,  97:  1.8625,  100:  2.6384,160:  2.9985,  185:  2.7481,  460:  6.4432,  987:  2.9959,  991:  2.9518,  1383:4.694,  1620:  3.073}))]

In  [21]:

rs_pddf  =  rescaledData.toPandas()

In  [22]:

rs_pddf.count()

Out[22]:

id  7540
user_id 7540
user_name   7540
tweet_text  7540
tokens  7540
rawFeatures 7540
features    7540
dtype:  int64


In  [27]:

feat_lst  =  rs_pddf.features.tolist()

In  [28]:
feat_lst[:2]

Out[28]:

[SparseVector(2000,  {74:  2.6762,  97:  1.8625,  100:  2.6384, 160:  2.9985,185:  2.7481,  742:  5.5269,  856:  4.1406,  991:  2.9518,  1383: 4.694,  1620:
3.073}),
SparseVector(2000,  {74:  2.6762,  97:  1.8625,  100:  2.6384, 160:  2.9985,185:  2.7481,  460:  6.4432,  987:  2.9959,  991:  2.9518,  1383: 4.694,  1620:3.073})]

运行聚类算法

在Twitter数据集上运行 K-Means 算法, 作为非标签的tweets, 希望看到Apache Spark tweets 形成一个聚类。 遵从以前的步骤, 特征的 TF-IDF 稀疏向量转化为一个 RDD 将被输入到 Spark MLlib 程序。初始化 K-Means 模型为 5 聚类, 10 次迭代:

In  [32]:

from  pyspark.mllib.clustering  import  KMeans,  KMeansModel
from  numpy  import  array
from  math  import  sqrt

In  [34]:

#  Load  and  parse  the  data


in_Data  =  sc.parallelize(feat_lst)

In  [35]:

in_Data.take(3)

Out[35]:

[SparseVector(2000,  {74:  2.6762,  97:  1.8625,  100:  2.6384, 160:  2.9985,185:  2.7481,  742:  5.5269,  856:  4.1406,  991:  2.9518,  1383: 4.694,  1620:3.073}),
SparseVector(2000,  {74:  2.6762,  97:  1.8625,  100:  2.6384, 160:  2.9985,185:  2.7481,  460:  6.4432,  987:  2.9959,  991:  2.9518,  1383: 4.694,  1620:3.073}),  
SparseVector(2000,  {20:  4.3534,  74:  2.6762,  97:  1.8625,  100:  5.2768,185:  2.7481,  856:  4.1406,  991:  2.9518,  1039:  3.073,  1620:  3.073,  1864:4.6377})]

In  [37]:

in_Data.count()

Out[37]:

7540

In  [38]:

#  Build  the  model  (cluster  the  data)

clusters  =  KMeans.train(in_Data,  5,  maxIterations=10,
runs=10,  initializationMode="random")

In  [53]:

#  Evaluate  clustering  by  computing  Within  Set  Sum  of  Squared  Errors

def  error(point):
    center  =  clusters.centers[clusters.predict(point)]
    return  sqrt(sum([x**2  for  x  in  (point  -  center)]))

WSSSE  =  in_Data.map(lambda  point:  error(point)).reduce(lambda  x,  y:  x +  y)
print("Within  Set  Sum  of  Squared  Error  =  "  +  str(WSSSE))

评估模型和结果

聚类算法调优的一个方式是改变聚类的个数并验证输出. 检查这些聚类,感受一下目前的聚类结果:

In  [43]:

cluster_membership  =  in_Data.map(lambda  x:clusters.predict(x))

In  [54]:  
cluster_idx  =  cluster_membership.zipWithIndex()

In  [55]:

type(cluster_idx)

Out[55]:

pyspark.rdd.PipelinedRDD

In  [58]:

cluster_idx.take(20)

Out[58]:

[(3, 0),
(3, 1),
(3, 2),
(3, 3),
(3, 4),
(3, 5),
(1, 6),
(3, 7),
(3, 8),
(3, 9),
(3, 10),
(3, 11),
(3, 12),
(3, 13),
(3, 14),
(1, 15),
(3, 16),
(3, 17),
(1, 18),
(1, 19)]

In  [59]:

cluster_df  =  cluster_idx.toDF()

In  [65]:
pddf_with_cluster  =  pd.concat([pddf_in,  cluster_pddf],axis=1)

In  [76]:

pddf_with_cluster._1.unique()

Out[76]:

array([3,  1,  4,  0,  2])

In  [79]:

pddf_with_cluster[pddf_with_cluster['_1']  ==  0].head(10)

Out[79]:
Unnamed:  0 id  created_at  user_id user_name   tweet_text  _1 _2
6227    3   642418116819988480  Fri  Sep  11  19:23:09  +0000  2015
49693598    Ajinkya  Kale   RT  @bigdata:  Distributed  Matrix  Computations
i...    0   6227
6257    45  642391207205859328  Fri  Sep  11  17:36:13  +0000  2015
937467860   Angela  Bassa   [Auto]  I'm  reading  ""Distributed  Matrix
Comput...   0   6257
6297    119 642348577147064320  Fri  Sep  11  14:46:49  +0000
2015    18318677    Ben  Lorica Distributed  Matrix  Computations  in  @
ApacheSpar...   0   6297
In  [80]:

pddf_with_cluster[pddf_with_cluster['_1']  ==  1].head(10)

Out[80]:
Unnamed:  0 id  created_at  user_id user_name   tweet_text  _1
_2
6   6   638830419090079746  Tue  Sep  01  21:46:55  +0000  2015
2241040634  Massimo  Carrisi    Python:Python:  Removing  \xa0  from
string?  -  I  ...  16
15  17  638830380578045953  Tue  Sep  01  21:46:46  +0000  2015
57699376    Rafael  Monnerat    RT  @ramalhoorg:  Noite  de  autógrafos  do
Fluent  ... 115
18  41  638830280988426250  Tue  Sep  01  21:46:22  +0000  2015
951081582   Jack  Baldwin   RT  @cloudaus:  We  are  3/4  full!  2-day  @
swcarpen... 1   18
19  42  638830276626399232  Tue  Sep  01  21:46:21  +0000  2015
6525302 Masayoshi  Nakamura PynamoDB  #AWS  #DynamoDB  #Python
http://...  1   19
20  43  638830213288235008  Tue  Sep  01  21:46:06  +0000  2015
3153874869  Baltimore  Python   Flexx:  Python  UI  tookit  based  on  web
technolog...    1   20
21  44  638830117645516800  Tue  Sep  01  21:45:43  +0000  2015
48474625    Radio  Free  Denali Hmm,  emerge  --depclean  wants  to  remove
somethi...  1   21
22  46  638829977014636544  Tue  Sep  01  21:45:10  +0000  2015
154915461   Luciano  Ramalho    Noite  de  autógrafos  do  Fluent  Python  no
Garoa  ...  122
23  47  638829882928070656  Tue  Sep  01  21:44:47  +0000  2015
917320920   bsbafflesbrains @DanSWright  Harper  channeling  Monty
Python.  "...   1   23
24  48  638829868679954432  Tue  Sep  01  21:44:44  +0000  2015
134280898   Lannick  Technology RT  @SergeyKalnish:  I  am  #hiring:
Senior  Back  e...  1   24
25  49  638829707484508161  Tue  Sep  01  21:44:05  +0000  2015
2839203454  Joshua  Jones   RT  @LindseyPelas:  Surviving  Monty  Python
in  Fl...   1   25
In  [81]:

pddf_with_cluster[pddf_with_cluster['_1']  ==  2].head(10)

Out[81]:
Unnamed:  0 id  created_at  user_id user_name   tweet_text  _1
_2
7280    688 639056941592014848  Wed  Sep  02  12:47:02  +0000  2015
2735137484  Chris   A  true  gay  icon  when  will  @ladygaga  @Madonna  @...
2   7280
In  [82]:

pddf_with_cluster[pddf_with_cluster['_1']  ==  3].head(10)

Out[82]:
Unnamed:  0 id  created_at  user_id user_name   tweet_text  _1
_2
0   0   638830426971181057  Tue  Sep  01  21:46:57  +0000  2015
3276255125  True  Equality  ernestsgantt:  BeyHiveInFrance:  9_A_6:
dreamint... 3   0
1   1   638830426727911424  Tue  Sep  01  21:46:57  +0000  2015
3276255125  True  Equality  ernestsgantt:  BeyHiveInFrance:
PhuketDailyNews...  3   1
2   2   638830425402556417  Tue  Sep  01  21:46:56  +0000  2015
3276255125  True  Equality  ernestsgantt:  BeyHiveInFrance:  9_A_6:
ernestsg... 3   2
3   3   638830424563716097  Tue  Sep  01  21:46:56  +0000  2015
3276255125  True  Equality  ernestsgantt:  BeyHiveInFrance:
PhuketDailyNews...  3   3
4   4   638830422256816132  Tue  Sep  01  21:46:56  +0000  2015
3276255125  True  Equality  ernestsgantt:  elsahel12:  9_A_6:
dreamintention...   3   4
5   5   638830420159655936  Tue  Sep  01  21:46:55  +0000  2015
3276255125  True  Equality  ernestsgantt:  BeyHiveInFrance:
PhuketDailyNews...  3   5
7   7   638830418330980352  Tue  Sep  01  21:46:55  +0000  2015
3276255125  True  Equality  ernestsgantt:  elsahel12:  9_A_6:
dreamintention...   3   7
8   8   638830397648822272  Tue  Sep  01  21:46:50  +0000  2015
3276255125  True  Equality  ernestsgantt:  BeyHiveInFrance:
PhuketDailyNews...  3   8
9   9   638830395375529984  Tue  Sep  01  21:46:49  +0000  2015
3276255125  True  Equality  ernestsgantt:  elsahel12:  9_A_6:
dreamintention...   3   9
10  10  638830392389177344  Tue  Sep  01  21:46:49  +0000  2015
3276255125  True  Equality  ernestsgantt:  BeyHiveInFrance:
PhuketDailyNews...  3   10
In  [83]:

pddf_with_cluster[pddf_with_cluster['_1']  ==  4].head(10)

Out[83]:
Unnamed:  0 id  created_at  user_id user_name   tweet_text  _1
_2
1361    882 642648214454317056  Sat  Sep  12  10:37:28  +0000  2015
27415756    Raymond  Enisuoh    LA  Chosen  For  US  2024  Olympic  Bid  -
LA2016  See...  4   1361
1363    885 642647848744583168  Sat  Sep  12  10:36:01  +0000  2015
27415756    Raymond  Enisuoh    Prison  See:  https://t.co/x3EKAExeFi  …  …  …
…  …  ...   41363
5412    11  640480770369286144  Sun  Sep  06  11:04:49  +0000  2015
3242403023  Donald  Trump  2016 "  igiboooy!  @  Starbucks  https://t.
co/97wdL... 4   5412
5428    27  640477140660518912  Sun  Sep  06  10:50:24  +0000  2015
3242403023  Donald  Trump  2016 "   @  Starbucks  https://t.co/
wsEYFIefk7  "  -  D...  4   5428
5455    61  640469542272110592  Sun  Sep  06  10:20:12  +0000  2015
3242403023  Donald  Trump  2016 "  starbucks  @  Starbucks  Mam  Plaza
https://t.co... 4   5455
5456    62  640469541370372096  Sun  Sep  06  10:20:12  +0000  2015
3242403023  Donald  Trump  2016 "  Aaahhh  the  pumpkin  spice  latte  is
back,  fall...  4   5456
5457    63  640469539524898817  Sun  Sep  06  10:20:12  +0000  2015
3242403023  Donald  Trump  2016 "  RT  kayyleighferry:  Oh  my  goddd
Harry  Potter  ...  45457
5458    64  640469537176031232  Sun  Sep  06  10:20:11  +0000  2015
3242403023  Donald  Trump  2016 "  Starbucks  https://t.co/3xYYXlwNkf
"  -  Donald... 4   5458

我们以部分样本tweet映射成5个聚类. Cluster 0 关于 Spark. Cluster 1
关于 Python。 Cluster 2 关于 Lady Gaga。 Cluster 3 关于Thailand’s Phuket
新闻。 Cluster 4 关于 Donald Trump.

构建机器学习流水线

我们希望当优化最佳参数来获得最好执行模型时,能够组合特征提取,准备活动,训练,测试,和预测活动。

在 Spark MLlib 中实现了强大的机器学习流水线,以5行代码准确地捕获了下面的tweet:
4-8 构建机器学习流水线

Spark ML 流水线是从 Python’s Scikit-Learn 中得到了灵感,创建了简洁数据连续转换的声明式语句可以快速地发布可调的模型。

PySpark中RDD的转换操作(转换算子) 在PySpark中,转换操作(转换算子)返回的结果通常是一个RDD对象或DataFrame对象或迭代器对象,具体返回类型取决于转换操作(转换算子)的类型和参数。在PySpark中,RDD提供了多种转换操作(转换算子),用于对元素进行转换和操作。函数来判断转换操作(转换算子)的返回类型,并使用相应的方法来处理返回结果。如果需要确定转换操作(转换算子)的返回类型,可以使用Python内置的。类似地,对于一个DataFrame对象,可以使用以下代码来判断。例如,对于一个包含整数的RDD,可以使用以下代码来判断。 阅读详情

相关推荐

Spark 2.x + Python 大数据机器学习实战

Spark 2.x + Python 大数据机器学习实战,本课程系统讲解如何在Spark2.0上高效运用Python来处理数据并建立机器学习模型,帮助读者开发并部署高效可拓展的实时Spark解决方案。

Spark RDD的属性

Spark RDD的属性

qq_41982570的博客 168

Spark for Python Developers 无水印pdf 0分

Paperback: 146 pages Publisher: Packt Publishing - ebooks Account (February 4, 2016) Language: English ISBN-10: 1784399698 ISBN-13: 978-1784399696 Key Features Set up real-time streaming and batch data intensive infrastructure using Spark and Python Deliver insightful visualizations in a web app using Spark (PySpark) Inject live data using Spark Streaming with real-time events Book Description Looking for a cluster computing system that provides high-level APIs? Apache Spark is your answer―an open source, fast, and general purpose cluster computing system. Spark's multi-stage memory primitives provide performance up to 100 times faster than Hadoop, and it is also well-suited for machine learning algorithms. Are you a Python developer inclined to work with Spark engine? If so, this book will be your companion as you create data-intensive app using Spark as a processing engine, Python visualization libraries, and web frameworks such as Flask. To begin with, you will learn the most effective way to install the Python development environment powered by Spark, Blaze, and Bookeh. You will then find out how to connect with data stores such as MySQL, MongoDB, Cassandra, and Hadoop. You'll expand your skills throughout, getting familiarized with the various data sources (Github, Twitter, Meetup, and Blogs), their data structures, and solutions to effectively tackle complexities. You'll explore datasets using iPython Notebook and will discover how to optimize the data models and pipeline. Finally, you'll get to know how to create training datasets and train the machine learning models. By the end of the book, you will have created a real-time and insightful trend tracker data-intensive app with Spark.

pyspark获取和处理RDD数据

弹性分布式数据集(RDD)是一组不可变的JVM对象的分布集,可以用于执行高速运算,它是Apache Spark的核心。 在pyspark中获取和处理RDD数据集的方法如下: 1. 首先是导入库和环境配置(本测试在linux的pycharm上完成) import os from pyspark import SparkContext, SparkConf from pyspark.sql.session import SparkSession os.environ["PYSPARK_PYTHON"]

Super乐De博客 1903

pandas和spark dataframe互相转换实例详解

主要介绍了pandas和spark dataframe互相转换实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

域控制器迁移后NETLOGON共享丢失的修复指南

本文详细解析了在Windows域控制器迁移后NETLOGON共享丢失的故障现象与修复方法。通过使用Dcdiag工具诊断,定位注册表键值SysVolReady异常及SCRIPTS目录缺失等核心原因,并提供了修改注册表、创建目录、重启Netlogon服务等逐步修复指南,帮助管理员快速恢复域用户登录功能,确保业务连续性。

weixin_29245767的博客 88

3. 'PipelinedRDD' object has no attribute '_jdf'

3. 'PipelinedRDD' object has no attribute '_jdf' 报这个错,是因为导入的机器学习包错误所致。 pyspark.ml是用来处理DataFrame pyspark.mllib是用来处理RDD。 所以你要看一下你自己代码里定义的是DataFram还是RDD。 此贴来自汇总贴的子问题,只是为了方便查询。 总贴请看置顶帖: pyspark...

元元的李树专栏 6280

【LDLTS解析】从重叠峰到精准参数:拉普拉斯深能级瞬态光谱如何重塑半导体缺陷分析

本文深入解析了拉普拉斯深能级瞬态光谱(LDLTS)技术如何革新半导体缺陷分析。针对传统DLTS难以分辨重叠峰的痛点,LDLTS通过拉普拉斯逆变换对高精度电容瞬态曲线进行数学解卷积,成功分离发射率相近的缺陷信号,实现从模糊宽峰到精准独立峰的转变。该技术不仅大幅提升了缺陷激活能和捕获截面等关键参数的提取精度,更推动分析范式从经验拟合转向第一性原理,为先进半导体工艺开发与良率提升提供了强大的精准诊断工具。

weixin_29224309的博客 273

地铁译:Spark for python developers ---Spark与数据的机器学习 ...

机器学习可以从数据中得到有用的见解. 目标是纵观Spark MLlib,采用合适的算法从数据集中生成见解。对于 Twitter的数据集, 采用非监督集群算法来区分与Apache
Spark相关的tweets . 初始输入是混合在一起的tweets。 首先提取相关特性, 然后在数...

weixin_33722405的博客 416

海思方案定制hi3531dv200/SS528 DVR方案解析:从硬件选型到编解码实战应用

海思方案,Hi3518EV100,Hi3518CV100,Hi3515CV100,Hi3516CV100,Hi3516ECV100,Hi3516D,Hi3516A,Hi3519,Hi3520D,Hi3521A,Hi3535,Hi3531,Hi3536,Hi3536C,Hi3536D,Hi3518EV200,Hi3518EV201,Hi3520DV200,Hi3516CV200,Hi3516CV300,Hi3516AV200,Hi3520DV300,Hi3519V101,sd3403,hi3519av200

1585

RPA 财务共享中心与RPA赋能

在和集团财务官交流的时候,客户经常会提到FSSC,其中有准备建立FSSC,正在建立FSSC,以及已建成FSSC正使用的,当中会有些对FSSC的疑虑和问题,所以花费些时间对FSSC进行了深入调研,从而也有幸拜读了王兴山、陈剑、梅震、钱自严等专业人士写的几本关于FSSC的书,对FSSC的前因后果有了更深入的认识,同时结合自己在FSSC的一些项目经验,故做了本次分享。 本文章主要分享财务共享中心以及R...

weixin_40244959的博客 2756

spark python 开发环境_地铁译:Spark for python developers --- 搭建Spark虚拟环境1

一个多月的地铁阅读时光,阅读《Spark for python developers》电子书,不动笔墨不看书,随手在evernote中做了一下翻译,多年不习英语,自娱自乐。周末整理了一下,发现再多做一点就可基本成文了,于是开始这个地铁译系列。本章中,我们将为开发搭建一个独立的虚拟环境,通过Spark和Anaconda提供的PyData 库为该环境补充能力。 这些库包括Pandas,Scikit-L...

weixin_39798626的博客 175

YOLOv11【第一章:零基础入门篇·第10节】YOLOv11项目实战:从零搭建检测系统!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 5768

地铁译:Spark for python developers --- 搭建Spark虚拟环境1

一个多月的地铁阅读时光,阅读《Spark for python developers》电子书,不动笔墨不看书,随手在evernote中做了一下翻译,多年不习英语,自娱自乐。周末整理了一下,发现再多做一点就可基本成文了,于是开始这个地铁译系列。 为开发搭建一个独立的虚拟环境,通过Spark和Anaconda提供的PyData 库为该环境补充能力。 这些库包括Pandas,Scikit-Learn, Blaze,

我相信...... 6223

c++对halcon的动态链接库dll封装及调用(细细讲)

本文详细介绍了将Halcon图像处理算法封装为C++动态链接库(DLL)的完整流程,包括7个关键步骤:1)封装Halcon函数并导出CPP文件;2)在C++项目中配置Halcon环境(包含目录、库目录设置);3)验证Halcon代码;4)创建DLL项目并进行环境配置;5)编辑DLL并导出生成文件(.dll、.lib、.h);6)在主项目中配置DLL调用环境;7)编写测试代码验证功能。通过这个流程实现了Halcon算法的模块化封装和复用,文中提供了具体的配置路径和代码示例,重点说明了环境配置细节和文件结构安排

Tianwen_running的博客 965

AI应用架构师视角:AI技术引发的全球经济格局重构,你看懂了吗?

本文将从AI应用架构师的独特视角,拆解AI技术栈(算力/算法/数据)如何通过"架构渗透"重塑产业价值链,分析中美欧等主要经济体的AI战略差异如何改写全球分工格局,并为企业与个人提供一套可落地的"AI经济适应性框架"。当OpenAI的GPT-4在代码生成、多模态理解上展现出超越人类的能力,当英伟达的H100芯片成为全球科技巨头争抢的"数字石油",当中国的AI大模型在电商、金融等场景实现规模化落地——我们正站在一场由AI技术引发的全球经济重构的临界点上。AI重构全球经济格局的过程,既是挑战,更是机遇。

小白菜的博客 1258

地铁译:Spark for python developers ---Spark的数据戏法

聚焦在 Twitter 上关于Apache Spark的数据, 这些是准备用于机器学习和流式处理应用的数据。 重点是如何通过分布式网络交换代码和数据,获得 串行化, 持久化 , 调度和缓存的实战经验 。 认真使用 Spark SQL, 交互性探索结构化和半结构化数据. Spark SQL 的基础数据结构是
Spark dataframe, Spark dataframe 受到了

我相信...... 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

地铁译:Spark for python developers --- 搭建Spark虚拟环境2

这一段,主要是 Spark 的基本概念,以及Anaconda的基本组成。 数据密集型应用利用可扩展的分布处理框架在大规模商业集群上分析PB级的数据. Hadoop 是第一个map-reduce的开源实现. Hadoop 依赖的分布式存储框架叫做 HDFS......Spark 是一个面向大规模数据处理的快速、分布式、通用的分析计算引擎. 主要不同于Hadoop的特点在于.....

我相信...... 5779

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

地铁译:Spark for python developers ---构建Spark批处理和流处理应用前的数据准备

从GitHub收集有关Apache Spark的信息, 在Twitter上检查相关的tweets, 使用 Meetup从更广泛的开源社区得到更多Spark 相关感受。 
本章中, 我们将概览各种信息和数据源,理解他们的结构,从批处理到流处理介绍数据处理流水线,要点如下: 
+ 从批处理到流处理介绍 ......

我相信...... 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

地铁译:Spark for python developers ---Spark的数据戏法 ...

聚焦在 Twitter 上关于Apache Spark的数据, 这些是准备用于机器学习和流式处理应用的数据。 重点是如何通过分布式网络交换代码和数据,获得 串行化, 持久化 , 调度和缓存的实战经验 。 认真使用 Spark SQL, 交互性探索结构化和半结构化数据. ...

测试0901-1 228

2S电池主动均衡实战:基于MP2642GR-Z与PIC18F4620的软硬件设计

锂电池串联应用中,电芯参数差异导致的电压失衡是影响电池组寿命与安全的关键问题。主动均衡技术通过能量转移替代传统电阻泄放,显著提升均衡效率,尤其在2S电池组这类基础单元中更具实用价值。围绕这一目标,文章深入解析了一套基于MP2642GR-Z升降压芯片与PIC18F4620微控制器的电感式主动均衡设计方案,涵盖硬件参数计算、均衡策略软件实现及调试排障经验,可应用于储能系统、电动工具等设备,为工程实践提供参考。

weixin_34348174的博客 164

地铁译:Spark for python developers --- 搭建Spark虚拟环境2 ...

这一段,主要是 Spark 的基本概念,以及Anaconda的基本组成。 理解Spark Hadoop 随着数据的增长水平扩展,可以运行在普通的硬件上, 所以是低成本的. 数据密集型应用利用可扩展的分布处理框架在大规模商业集群上分析PB级的数据. Hadoop 是第一个...

weixin_34008805的博客 116
上一篇: NoSQL 与大数据
下一篇: 大数据架构的典型方法和方式
半吊子全栈工匠
半吊子全栈工匠 领域专家: 嵌入式与硬件开发技术领域 领域专家: 嵌入式与硬件开发技术领域
博客等级 码龄18年 4632粉丝 897原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值