pyspark学习之——基本统计

pyspark学习之——基本统计,第1张

pyspark学习之——基本统计

       记录pyspark学习篇,学习资料来自spark官方文档,主要记录pyspark相关内容,要么直接翻译过来,要么加上自己的理解。spark2.4.8官方文档如下: https://spark.apache.org/docs/2.4.8/ml-statistics.html

目录
  • 基本统计
    • 1.相关性
      • 1.1 导包
      • 1.2 本地向量生成方法
        • 1.2.1 生成稠密向量
        • 1.2.2 生成稀疏向量
      • 1.3 生成实验用本地向量
    • 2 假设检验
    • 3.Summarizer

基本统计 1.相关性

       【百度百科】相关性分析是指对两个或多个具备相关性的变量元素进行分析,从而衡量两个变量因素的相关密切程度。
       spark中相关性的包在spark.ml.stat下,目前支持的方法是皮尔逊相关法和斯皮尔曼相关法。通过本地向量来说明如何使用相关性来进行分析。

1.1 导包
# 导包,导入Vectors和Correlation
# Vectors用来生成本地向量
from pyspark.ml.linalg import Vectors
from pyspark.ml.stat import Correlation
1.2 本地向量生成方法

       首先介绍Vectors生成两种本地向量的两种方法:一种是稠密向量,默认使用双精度浮点数组来表示每一维元素;第二种是稀疏向量,索引的默认格式是整形,元素的默认格式是双精度浮点数。

1.2.1 生成稠密向量
# Vectors.dense()用来生成稠密向量,Vectors.sparse()用来生成稀疏向量
# Vectors.dense()用来生成稠密向量例子
data1 = Vectors.dense(1,2,3) 
# data1具体值为:DenseVector([1.0, 2.0, 3.0]) 表示生成的是一个稠密向量,可以看到元素类型自动转为浮点型
# 当然还可以使用元组和列表来生成,效果是一样的
Vectors.dense((1,2,3))
Vectors.dense([1,2,3])
# 输出都是一样的:DenseVector([1.0, 2.0, 3.0])
1.2.2 生成稀疏向量

       

# Vectors.sparse()用来生成稀疏向量

# 方法一:利用两个列表或元组。
#         第一个元素表示向量维度(也就是这个向量有几个元素)
#     第一个列表或元组表示非零元素的位置(从0开始),即索引
#         第二个列表或元组表示非零元素具体的值,即值
Vectors.sparse(5,[0,3],[4,9])
Vectors.sparse(5,[0,3],(4,9))
Vectors.sparse(5,(0,3),(4,9))
# 5表示生成一个维度为5的稀疏向量,
# [0,3]表示非零元素的位置是0和3(第1个和第4个元素非零),
# [4,9]表示非零元素依次是4和9,也就是0号位置是4,3号位置是9
# 输出都是:SparseVector(5, {0: 4.0, 3: 9.0}),字典表示0号位置元素为4.0,  3号位置元素是9.0
# 同样可以看到元素类型自动转为浮点型


# 方法二:利用一个元组或列表(元素是若干个列表或元组,形式需一致,要么只能是元组,要么只能是列表)
#         第一个元素表示向量维度(也就是这个向量有几个元素)
#     内部的元素表示(索引:值)
Vectors.sparse(5,([0,3],[4,9]))
Vectors.sparse(5,[[0,3],(4,9)]) # 会报错,不能这么写,因为内部形式不一致,一个是列表,一个是元组。具体错误:TypeError: '<' not supported between instances of 'tuple' and 'list'
Vectors.sparse(5,[(0,3),(4,9)])
Vectors.sparse(5,((0,3),(4,9)))
# 5表示生成一个维度为5的稀疏向量,
# ([0,3],[4,9])中的[0,3]表示第一个非零元素的位置是0,值是3
# ([0,3],[4,9])中的[4,9]表示第二个非零元素的位置是4,值是9
# 输出都是一样的:SparseVector(5, {0: 3.0, 4: 9.0}),字典表示0号位置元素为3.0,  3号位置元素是9.0
# 可以看到和方法一生成的向量是不一样的,这一点要注意区分
# 

# 方法三:利用字典
# 从方法一和方法二可以看到,得到的结果都是形如SparseVector(5, {0: 3.0, 4: 9.0})的格式,
# 所以第三种方法也可以直接用字典来做

# 和方法二一样,假设生成一个5维数据,0号位置元素为4.0,  3号位置元素是9.0
Vectors.sparse(5,{0:4,3:9})
1.3 生成实验用本地向量

       通过1.2节介绍的方法来生成向量,作为相关性分析的实验数据。假设要分析的数据如下:

X = [ 1 0 0 − 2 4 5 0 3 6 7 0 8 9 0 0 1 ] X=begin{bmatrix} 1 &0&0&-2 &5&0&3 &7&0&8 &0&0&1end{bmatrix} X=⎣⎢⎢⎡​1469​0570​0000​−2381​⎦⎥⎥⎤​

       其中,每一行表示一个样本,每一列表示一个属性

# 生成数据
data = [(Vectors.sparse(4, [(0, 1.0), (3, -2.0)]),),
        (Vectors.dense([4.0, 5.0, 0.0, 3.0]),),
        (Vectors.dense([6.0, 7.0, 0.0, 8.0]),),
        (Vectors.sparse(4, [(0, 9.0), (3, 1.0)]),)]
# 转换为Dataframe格式
df = spark.createDataframe(data, ["features"])
# 取出值
r1 = Correlation.corr(df, "features").head()
# 转换为字符串打印出来
print("Pearson correlation matrix:n" + str(r1[0]))

# 输出为
Pearson correlation matrix:
DenseMatrix([[1.        , 0.05564149,        nan, 0.40047142],
             [0.05564149, 1.        ,        nan, 0.91359586],
             [       nan,        nan, 1.        ,        nan],
             [0.40047142, 0.91359586,        nan, 1.        ]])


# 同样可以通过numpy来做
import numpy as np
x = np.array([[1,0,0,-2.],
              [4,5,0,3.],
              [6,7,0,8.],
              [9,0,0,1.]])
        
# numpy中计算相关系数,每一行表示一个属性,每一列表示一个样本,所以需要把数据转置处理,使得输入符合要求
np.corrcoef(x.T)

# 输出为
array([[1.        , 0.05564149,        nan, 0.40047142],
       [0.05564149, 1.        ,        nan, 0.91359586],
       [       nan,        nan,        nan,        nan],
       [0.40047142, 0.91359586,        nan, 1.        ]])
2 假设检验

       总体的分布函数完全未知或只知形式、但不知其参数的情况,为了推断总体的某些未知特性,提出某些关于总体的假设。我们要根据样本对所提出的假设作出是接受,还是拒绝的决策,假设检验是作出这一决策的过程。
       卡方检验是假设检验的一种。卡方检验可以针对标签和特征进行皮尔森独立性检验,对于每一个特征,构建(特征,标签)这样的矩阵,计算卡方统计量。目前spark.ml.stat支持卡方检验。

# 导包
from pyspark.ml.linalg import Vectors
from pyspark.ml.stat import ChiSquareTest

# 生成向量 
# 元组中第一个元素是标签,第二个元素是特征
data = [(0.0, Vectors.dense(0.5, 10.0)),
        (0.0, Vectors.dense(1.5, 20.0)),
        (1.0, Vectors.dense(1.5, 30.0)),
        (0.0, Vectors.dense(3.5, 30.0)),
        (0.0, Vectors.dense(3.5, 40.0)),
        (1.0, Vectors.dense(3.5, 40.0))]
# 生成Dataframe
df= spark.createDataframe(data,['label','features'])

# 调用卡方检验 ChiSquareTest.test(数据, 特征, 标签)
#  返回的一行包括三个值:- pValues: Vector - degreesOfFreedom: Array[Int] - statistics: Vector
chiSqResult = ChiSquareTest.test(df,'features','label')

# 获取pValues,使用head()
pValues=chiSqResult.head()[0]
# 或者使用collect()
pValues=chiSqResult.collect()[0][0]
# 或者使用select()和collect()
pValues=chiSqResult.select("pValues").collect()[0][0]
3.Summarizer

       主要用来对Dataframe进行统计,比如最大值、最小值、方差、均值、非零值等等。Summarizer在spark.ml.stat包中。

# 导包
from pyspark.ml.linalg import Vectors
from pyspark.ml.stat import Summarizer
from pyspark.sql import Row

# 生成Dataframe:这里先利用parallelize生成带权重的RDD,再利用toDF将其转为Dataframe
df = sc.parallelize([Row(weight=1.0,features=Vectors.dense(1,1,1)),
					 Row(weitht=0.0,features=Vectors.dense(1.,2,3))]).toDF()

# 一、有多个统计量时利用Summarizer.metrics(假设统计均值和数量)
summarizer = Summarizer.metrics("mean", "count")

# 1.1带权重的统计
# 当一行太长时,默认不全部显示,设置truncate=False表示全部显示
df.select(summarizer.summary(df.features, df.weight)).show(truncate=False)
# 结果如下:
+-----------------------------------+
|aggregate_metrics(features, weight)|
+-----------------------------------+
|[[1.0,1.0,1.0], 1]                 |
+-----------------------------------+
# 可以看到带权重时,因为Row(weitht=0.0,features=Vectors.dense(1.,2,3))的权重为0,所以不参与统计。
# 所以只有权重weight=1的才参与计算,三个特征的均值就是自身,总数量为1

# 1.2不带权重的统计:
df.select(summarizer.summary(df.features)).show(truncate=False)
# 结果如下:
+--------------------------------+
|aggregate_metrics(features, 1.0)|
+--------------------------------+
|[[1.0,1.5,2.0], 2]              |
+--------------------------------+
# 可以看到不带权重时,所有样本均参与运算
# 所以三个特征的均值就是(1+1)/2,(1+2)/2,(1+3)/2,总数量为2

# 二、统计单个时,直接使用Summarizer
# 2.1只统计带有权重的均值
df.select(Summarizer.mean(df.features,df.weight)).show(truncate=False)
# 结果如下:
+--------------+
|mean(features)|
+--------------+
|[1.0,1.0,1.0] |
+--------------+
# 2.2统计不带有权重的均值
df.select(Summarizer.mean(df.features)).show(truncate=False)
# 结果如下:
+--------------+
|mean(features)|
+--------------+
|[1.0,1.5,2.0] |
+--------------+

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zaji/5665571.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-16

发表评论

登录后才能评论

评论列表(0条)

    保存