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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Machine Learning on Spark——第四节 统计基础(二) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:周志湖
微信號(hào):zhouzhihubeyond

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

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

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

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

    方差具有如下定義形式:

    標(biāo)準(zhǔn)差具有如下定義形式:

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

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

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

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

    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))//兩個(gè)rdd間的相關(guān)性//返回值:correlation: Double = 0.959034501397483//[-1, 1],值越接近于1,其相關(guān)度越高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") }

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

    直觀地看,成績(jī)?cè)礁弋a(chǎn)量越高,如果使用pearson相關(guān)系數(shù),將得到如下結(jié)果:

    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í)行結(jié)果為: //correlation4: Double = 0.6915716600436548 val correlation4:Double = Statistics.corr(rdd4, rdd5, "pearson")

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

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

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

    2. 分層采樣(Stratified sampling)

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

    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)匯總結(jié)果 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方法進(jìn)行采樣 val approxSample = wordCounts.sampleByKey(false, fractions) //使用sampleByKeyExact方法進(jìn)行采樣,該方法資源消耗較sampleByKey更大 //但采樣后的大小與預(yù)期大小更接近,可信度達(dá)到99.99% val exactSample = wordCounts.sampleByKeyExact(false, fractions) }

    3. 隨機(jī)數(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個(gè)服從標(biāo)準(zhǔn)正態(tài)分面N(0,1)的隨機(jī)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

    總結(jié)

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

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