日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Machine Learning on Spark——统计基础(二)

發(fā)布時間:2024/1/23 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Machine Learning on Spark——统计基础(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本節(jié)主要內(nèi)容

  • Correlation 相關性分析
  • 分層采樣(Stratified sampling)
  • 隨機數(shù)據(jù)生成(Random data generation)
  • 1. Correlation 相關性分析

    相關性分析用于研究兩個隨機變量之間的依賴關系,它是統(tǒng)計學當中的一種十分重要的方法,在Spark中只實現(xiàn)了兩種相關性分析方法,分別是皮爾遜(Pearson)與斯皮爾曼(Spearman)相關性分析方法,具體可參見。皮爾遜(Pearson)相關系數(shù)(具體參見:https://en.wikipedia.org/wiki/Correlation_coefficient)定義如下:

    其中,協(xié)方差有如下定義形式:

    方差具有如下定義形式:

    標準差具有如下定義形式:

    上述公式中的方差、標準差只能用來描述一維數(shù)據(jù),協(xié)方差的意義在于其能夠描述多維數(shù)據(jù),如果結果為正值,則說明兩者是正相關的,為負值則為負相關,值為0,則表示兩者不相關,從上述幾個公式的定義可以推出下列公式:

    協(xié)方差可以將數(shù)據(jù)擴展到二維,對于n維數(shù)據(jù),就需要計算

    個協(xié)方差,此時自然而然地將其組織為協(xié)方差矩陣,例如一個三維變量x,y,z構成的協(xié)方差矩陣具有如下形式:

    從上面的圖可以看到:協(xié)方差矩陣是一個對稱的矩陣,而且對角線是各個維度的方差。皮爾遜(Pearson)相關系數(shù)通過協(xié)方差矩陣便可得到。PearsonCorrelation在Spark中是私有成員,不能直接訪問,使用時仍然是通過Statistics對象進行

    import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.mllib.stat._ import org.apache.spark.rdd.RDD import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.linalg.{Matrix, Vector}object CorrelationDemo extends App {val sparkConf = new SparkConf().setAppName("StatisticsDemo").setMaster("spark://sparkmaster:7077") val sc = new SparkContext(sparkConf)val rdd1:RDD[Double] = sc.parallelize(Array(11.0, 21.0, 13.0, 14.0))val rdd2:RDD[Double] = sc.parallelize(Array(11.0, 20.0, 13.0, 16.0))//兩個rdd間的相關性//返回值:correlation: Double = 0.959034501397483//[-1, 1],值越接近于1,其相關度越高val correlation:Double = Statistics.corr(rdd1, rdd2, "pearson")val rdd3:RDD[Vector]= sc.parallelize(Array(Array(1.0,2.0,3.0,4.0),Array(2.0,3.0,4.0,5.0),Array(3.0,4.0,5.0,6.0))).map(f => Vectors.dense(f))//correlation3: org.apache.spark.mllib.linalg.Matrix = //1.0 1.0 1.0 1.0 //1.0 1.0 1.0 1.0 //1.0 1.0 1.0 1.0 //1.0 1.0 1.0 1.0 val correlation3:Matrix = Statistics.corr(rdd3, "pearson") }

    假設某工廠通過隨機抽樣得到考試成績與產(chǎn)量之間的關系數(shù)據(jù)如下:

    直觀地看,成績越高產(chǎn)量越高,如果使用pearson相關系數(shù),將得到如下結果:

    val rdd4:RDD[Double] = sc.parallelize(Array(50.0, 60.0, 70.0, 80.0,90.0,95.0))val rdd5:RDD[Double] = sc.parallelize(Array(500.0, 510.0, 530.0, 580.0,560,1000)) //執(zhí)行結果為: //correlation4: Double = 0.6915716600436548 val correlation4:Double = Statistics.corr(rdd4, rdd5, "pearson")

    但其實從我們觀察的數(shù)據(jù)來看,它們應該是高度相關的,雖然0.69也一定程度地反應了數(shù)據(jù)間的相關性,但表達力仍然不夠,為此可以引入Spearman相關系數(shù)(參見http://www.360doc.com/content/08/1228/23/50235_2219531.shtml),如表中的第四、第五列數(shù)據(jù),通過將成績和產(chǎn)量替換成等級,那它們之間的相關度會明顯提高,這樣的話表達能力更強,如下列代碼所示:

    //采用spearman相關系數(shù) //執(zhí)行結果: //correlation5: Double = 0.9428571428571412val correlation5:Double = Statistics.corr(rdd4, rdd5, "spearman")

    從上面的執(zhí)行結果來看,相關性從pearson的值0.6915716600436548提高到了0.9428571428571412。由于利用的等級相關,因而spearman相關性分析也稱為spearman等級相關分析或等級差數(shù)法,但需要注意的是spearman相關性分析方法涉及到等級的排序問題,在分布式環(huán)境下的排序可能會涉及到大量的網(wǎng)絡IO操作,算法效率不是特別高。

    2. 分層采樣(Stratified sampling)

    本小節(jié)使用spark自帶的README.md文件進行相應的演示操作

    package cn.ml.statimport org.apache.spark.SparkContext import org.apache.spark.SparkContext._ import org.apache.spark.rdd.PairRDDFunctions import org.apache.spark.SparkConfobject StratifiedSampleDemo extends App {val sparkConf = new SparkConf().setAppName("StatisticsDemo").setMaster("spark://sparkmaster:7077") val sc = new SparkContext(sparkConf)//讀取HDFS上的README.md文件 val textFile = sc.textFile("/README.md") //wordCount操作,返回(K,V)匯總結果 val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)//定義key為spark,采樣比率為0.5 val fractions: Map[String, Double] = Map("Spark"->0.5)//使用sampleByKey方法進行采樣 val approxSample = wordCounts.sampleByKey(false, fractions) //使用sampleByKeyExact方法進行采樣,該方法資源消耗較sampleByKey更大 //但采樣后的大小與預期大小更接近,可信度達到99.99% val exactSample = wordCounts.sampleByKeyExact(false, fractions) }

    3. 隨機數(shù)據(jù)生成(Random data generation)

    scala> import org.apache.spark.SparkContext import org.apache.spark.SparkContextscala> import org.apache.spark.mllib.random.RandomRDDs._ import org.apache.spark.mllib.random.RandomRDDs._//生成100個服從標準正態(tài)分面N(0,1)的隨機RDD數(shù)據(jù),10為指定的分區(qū)數(shù) scala> val u = normalRDD(sc, 100L, 10) u: org.apache.spark.rdd.RDD[Double] = RandomRDD[26] at RDD at RandomRDD.scala:38//轉(zhuǎn)換使其服從N(1,4)的正太分布 scala> val v = u.map(x => 1.0 + 2.0 * x) v: org.apache.spark.rdd.RDD[Double] = MapPartitionsRDD[27] at map at <console>:27

    總結

    以上是生活随笔為你收集整理的Machine Learning on Spark——统计基础(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。