目錄
一、數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)
1、概念
2、人工智能
3、數(shù)據(jù)挖掘體系
二、機(jī)器學(xué)習(xí)
1、什么是機(jī)器學(xué)習(xí)
2、機(jī)器學(xué)習(xí)的應(yīng)用
3、實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的工具與技術(shù)框架
三、Spark MLlib介紹
1、簡介
2、MLlib基本數(shù)據(jù)類型
Ⅰ、概述
Ⅱ、本地向量
Ⅲ、向量標(biāo)簽的使用
Ⅳ、本地矩陣
Ⅴ、分布式矩陣的使用
3、MLlib統(tǒng)計(jì)量基礎(chǔ)
Ⅰ、概述
Ⅱ、計(jì)算基本統(tǒng)計(jì)量
Ⅲ、計(jì)算相關(guān)系數(shù)
四、距離度量和相似度度量
1、概念
2、歐氏距離
3、曼哈頓距離
4、切比雪夫距離
五、最小二乘法
1、簡介
2、原理及推導(dǎo)
3、案例練習(xí)
4、多元線性回歸模型的細(xì)節(jié)說明
一、數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)
1、概念
數(shù)據(jù)挖掘:也成為data mining,它是一個(gè)很寬泛的概念,也是現(xiàn)在新興的學(xué)科,目的在如何從海量數(shù)據(jù)中挖掘出有用的信息來
數(shù)據(jù)挖掘這個(gè)工作BI(商業(yè)智能)可以做,統(tǒng)計(jì)分析可以做,大數(shù)據(jù)技術(shù)可以做,市場運(yùn)營也可以做,或者用excel分析數(shù)據(jù),發(fā)現(xiàn)了一些有用的信息,然后這些信息可以指導(dǎo)你的業(yè)務(wù)business,這也屬于數(shù)據(jù)挖掘。
機(jī)器學(xué)習(xí):machine learning,是計(jì)算機(jī)科學(xué)與統(tǒng)計(jì)學(xué)交叉的學(xué)科,基本目標(biāo)是學(xué)習(xí)一個(gè)x->y的函數(shù)(映射),來做分類、聚類或者回歸的工作?,F(xiàn)在好多數(shù)據(jù)挖掘的工作是通過機(jī)器學(xué)習(xí)提供的算法工具實(shí)現(xiàn)的,比如說PB級(jí)別的點(diǎn)擊日志通過典型的機(jī)器學(xué)習(xí)流程可以得到一個(gè)預(yù)估模型,從而提高互聯(lián)網(wǎng)廣告的點(diǎn)擊率和回報(bào)率;個(gè)性化推薦,還是通過機(jī)器學(xué)習(xí)的一些算法分析平臺(tái)上的各種購買,瀏覽和收藏日志得到的一個(gè)推薦模型,然后預(yù)測你喜歡的商品,還有現(xiàn)在的抖音你點(diǎn)贊關(guān)注什么類型的視頻,就會(huì)給你推薦相似類型的視頻等等
深度學(xué)習(xí):deep learning,機(jī)器學(xué)習(xí)里面現(xiàn)在比較火的一個(gè)topic,本身是神經(jīng)網(wǎng)絡(luò)算法的衍生,在圖像,語言等富媒體的分類和識(shí)別上取得非常好的效果,所以各大研究機(jī)構(gòu)和公司都投入大量的讓人力做相關(guān)的研究和開發(fā)。
總結(jié):數(shù)據(jù)挖掘是一個(gè)很寬泛的概念,數(shù)據(jù)挖掘經(jīng)常用的方法來自于機(jī)器學(xué)習(xí)這門學(xué)科,深度學(xué)習(xí)也是來源于機(jī)器學(xué)習(xí)的算法模型,本質(zhì)上是原來的神經(jīng)網(wǎng)絡(luò)。
2、人工智能
“人工智能”一詞最初是在1956 年Dartmouth學(xué)會(huì)上提出的。從那以后,研究者們發(fā)展了眾多理論和原理,人工智能的概念也隨之?dāng)U展。人工智能(Artificial Intelligence),英文縮寫為AI。它是研究、開發(fā)用于模擬、延伸和擴(kuò)展人的智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的一門新的技術(shù)科學(xué)。人工智能是計(jì)算機(jī)科學(xué)的一個(gè)分支,它企圖了解智能的實(shí)質(zhì),并生產(chǎn)出一種新的能以人類智能相似的方式做出反應(yīng)的智能機(jī)器,該領(lǐng)域的研究包括機(jī)器人、語言識(shí)別、圖像識(shí)別、自然語言處理和專家系統(tǒng)等。人工智能從誕生以來,理論和技術(shù)日益成熟,應(yīng)用領(lǐng)域也不斷擴(kuò)大,可以設(shè)想,未來人工智能帶來的科技產(chǎn)品,將會(huì)是人類智慧的“容器”。
人工智能是對(duì)人的意識(shí)、思維的信息過程的模擬。人工智能不是人的智能,但能像人那樣思考、也可能超過人的智能。
3、數(shù)據(jù)挖掘體系
二、機(jī)器學(xué)習(xí)
1、什么是機(jī)器學(xué)習(xí)
機(jī)器學(xué)習(xí)是是一門多領(lǐng)域交叉學(xué)科。涉及概率論、統(tǒng)計(jì)學(xué)、逼近論、凸分析、算法復(fù)雜度理論等多門學(xué)科。機(jī)器學(xué)習(xí)的算法在數(shù)據(jù)挖掘里被大量使用。
此外它是人工智能的核心,是使計(jì)算機(jī)具有智能的根本途徑,其應(yīng)用遍及人工智能的各個(gè)領(lǐng)域。
2、機(jī)器學(xué)習(xí)的應(yīng)用
①、市場分析和管理
比如:目標(biāo)市場,客戶關(guān)系管理(CRM),市場占有量分析,交叉銷售,市場分割
1.比如做目標(biāo)市場分析:
構(gòu)建一系列的“客戶群模型”,這些顧客具有相同特征:興趣愛好,收入水平,消費(fèi)習(xí)慣,等等。確定顧客的購買模式
CTR估計(jì)(廣告點(diǎn)擊率預(yù)測)比如通過邏輯回歸來實(shí)現(xiàn)。
2.比如做交叉市場分析:
貨物銷售之間的相互聯(lián)系和相關(guān)性,以及基于這種聯(lián)系上的預(yù)測
②、風(fēng)險(xiǎn)分析和管理,風(fēng)險(xiǎn)預(yù)測,客戶保持,保險(xiǎn)業(yè)的改良,質(zhì)量控制,競爭分析
1.比如做公司分析和風(fēng)險(xiǎn)管理:
財(cái)務(wù)計(jì)劃——現(xiàn)金流轉(zhuǎn)分析和預(yù)測
資源計(jì)劃——總結(jié)和比較資源和花費(fèi)
競爭分析——對(duì)競爭者和市場趨勢的監(jiān)控
對(duì)顧客按等級(jí)分組和基于等級(jí)的定價(jià)過程
針對(duì)上述的場景,可以通過聚類模型將整個(gè)數(shù)據(jù)樣本劃分為兩類,從而找到低價(jià)值和高價(jià)值用戶,進(jìn)而完成客戶關(guān)系的維護(hù)
對(duì)定價(jià)策略應(yīng)用于競爭更激烈的市場中
保險(xiǎn)公司對(duì)于保險(xiǎn)費(fèi)率的厘定
比如:
根據(jù)以往的歷史數(shù)據(jù)建立回歸模型,同回歸模型可以實(shí)現(xiàn)預(yù)測
?
③、欺騙檢測和異常模式的監(jiān)測(孤立點(diǎn))
欺詐行為檢測和異常模式
1.比如對(duì)欺騙行為進(jìn)行聚類和建模,并進(jìn)行孤立點(diǎn)分析
2.汽車保險(xiǎn):相撞事件的分析
3.洗錢:發(fā)現(xiàn)可疑的貨幣交易行為
4.醫(yī)療保險(xiǎn):職業(yè)病人,醫(yī)生或以及相關(guān)數(shù)據(jù)分析
5.電信:電話呼叫欺騙行為,根據(jù)呼叫目的地,持續(xù)事件,日或周呼叫次數(shù),分析該模型發(fā)現(xiàn)與期待標(biāo)準(zhǔn)的偏差
6.零售產(chǎn)業(yè):比如根據(jù)分析師估計(jì)有38%的零售額下降是由于雇員的不誠實(shí)行為造成的
7.反恐
④、文本挖掘
1.新聞組
2.電子郵件(垃圾郵件的過濾)可以通過貝葉斯來實(shí)現(xiàn)
3.文檔歸類
4.評(píng)論自動(dòng)分析
5.垃圾信息過濾
6.網(wǎng)頁自動(dòng)分類等
⑤、天文學(xué)
?例如:JPL實(shí)驗(yàn)室和Palomar天文臺(tái)層借助于數(shù)據(jù)挖掘工具
⑥、推薦系統(tǒng)
當(dāng)當(dāng)網(wǎng)的圖書推薦
汽車之家的同類汽車推薦
淘寶的同類商品推薦
新浪的視頻推薦
百度知道的問題推薦
社交推薦
職位推薦
⑦、智能博弈
棋譜學(xué)習(xí)
⑧、頻繁模式挖掘
購物籃商品分析,典型案例:啤酒-尿布
⑨、模式識(shí)別
1.語音識(shí)別
2.圖像識(shí)別
n 指紋、虹膜紋識(shí)別
n 臉像識(shí)別
n 車牌識(shí)別
n 動(dòng)態(tài)圖像識(shí)別
n 小波分析
3、實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法的工具與技術(shù)框架
Matlab? ? ? ? R
Pyhton? ? ? ? SPSS
Eviews? ? ? ? Hadoop(Mahout)
Spark(MLlib)
三、Spark MLlib介紹
1、簡介
MLlib是一個(gè)構(gòu)建在Spark上的、專門針對(duì)大數(shù)據(jù)處理的并發(fā)式高速機(jī)器學(xué)習(xí)庫,其特點(diǎn)是采用較為先進(jìn)的迭代式、內(nèi)存存儲(chǔ)的分析計(jì)算,使得數(shù)據(jù)的計(jì)算處理速度大大高于普通的數(shù)據(jù)處理引擎。
MLlib機(jī)器學(xué)習(xí)庫還在不停地更新中,Apache的相關(guān)研究人員仍在不停地為其中添加更多的機(jī)器學(xué)習(xí)算法。目前MLlib中已經(jīng)有通用的學(xué)習(xí)算法和工具類,包括統(tǒng)計(jì)、分類、回歸、聚類、降維等。
MLlib采用Scala語言編寫,Scala語言是運(yùn)行在JVM上的一種函數(shù)式編程語言,特點(diǎn)就是可移植性強(qiáng),“一次編寫,到處運(yùn)行”是其最重要的特點(diǎn)。借助于RDD數(shù)據(jù)統(tǒng)一輸入格式,讓用戶可以在不同的IDE上編寫數(shù)據(jù)處理程序,通過本地化測試后可以在略微修改運(yùn)行參數(shù)后直接在集群上運(yùn)行。對(duì)結(jié)果的獲取更為可視化和直觀,不會(huì)因?yàn)檫\(yùn)行系統(tǒng)底層的不同而造成結(jié)果的差異與改變。
2、MLlib基本數(shù)據(jù)類型
Ⅰ、概述
RDD是MLlib專用的數(shù)據(jù)格式,它參考了Scala函數(shù)式編程思想,并大膽引入統(tǒng)計(jì)分析概念,將存儲(chǔ)數(shù)據(jù)轉(zhuǎn)化成向量和矩陣的形式進(jìn)行存儲(chǔ)和計(jì)算,這樣將數(shù)據(jù)定量化表示,能更準(zhǔn)確地整理和分析結(jié)果。
它支持多種數(shù)據(jù)類型,也支持部署在本地計(jì)算機(jī)的本地化格式
類型名稱 |
釋義 |
Local vector |
本地向量集。主要向Spark提供一組可進(jìn)行操作的數(shù)據(jù)集合 |
Labeled point |
向量標(biāo)簽。讓用戶能夠分類不同的數(shù)據(jù)集合 |
Local matrix |
本地矩陣。將數(shù)據(jù)結(jié)合以矩陣形式存儲(chǔ)在本地計(jì)算機(jī)中 |
Distributed matrix |
分布式矩陣。將矩陣集合以矩陣形式存儲(chǔ)在分布式計(jì)算機(jī)中 |
Ⅱ、本地向量
MLlib使用本地化存儲(chǔ)類型是向量,這里向量主要有兩類:稀疏性數(shù)據(jù)集和密集型數(shù)據(jù)集
舉例:
package cn.yang.vector
import org.apache.spark.mllib.linalg.Vectors
object Driver {
def main(args:Array[String]):Unit={
//--建立密集型向量
//--dense可以將其理解為MLlib專用的一種集合形式,它與Array類似
val vd=Vectors.dense(2,0,6)//
println(vd) //[2.0,0.0,6.0]
//一參:size。spare方法是將給定的數(shù)據(jù)Array數(shù)據(jù)(9,5,2,7)分解成指定的size個(gè)部分進(jìn)行處理,本例中是7個(gè)
//二參:輸入數(shù)據(jù)對(duì)應(yīng)的下標(biāo),要求遞增,并且最大值要小于等于size
//三參:輸入數(shù)據(jù)。本例中是Array(9,5,2,7)
val vs=Vectors.sparse(7,Array(0,1,3,6),Array(9,5,2,7))
println(vs(6)) //7.0
}
}
package cn.yang.vector
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
/**
* 學(xué)習(xí)MLib的向量類型,后續(xù)有很多模型,建模時(shí)需要將數(shù)據(jù)封裝成為向量類型來處理
*/
object Driver01 {
def main(args: Array[String]): Unit = {
//通過傳入指定個(gè)數(shù)的double參數(shù)創(chuàng)建向量
//如果傳入其他的數(shù)值類型參數(shù),可以隱式轉(zhuǎn)換為double類型
val v1=Vectors.dense(2.5, 1.5,5.6)
val v2=Vectors.dense(1,2,3)
//可以通過下標(biāo)的方式操作向量
println(v1(0))
println(v2)
//重點(diǎn)掌握下面的方式來創(chuàng)建向量
val v3 =Vectors.dense(Array[Double](1,2,3))
val v4 = Vectors.dense(Array(1.1,2.1,3.3))
//練習(xí)1:通過Spark處理vectors.txt。RDD[line:String]->RDD[Vector]
val conf =new SparkConf().setMaster("local").setAppName("vector")
val sc = new SparkContext(conf)
val data = sc.textFile("D://data/ml/vectors.txt")
val r1=data.map{line=>line.split(" ").map { num => num.toDouble }}
.map{arr=>Vectors.dense(arr)}
r1.foreach(println)
}
}
Ⅲ、向量標(biāo)簽的使用
向量標(biāo)簽用于對(duì)MLlib中機(jī)器學(xué)習(xí)算法的不同值做標(biāo)記。例如分類問題中,可以將不同的數(shù)據(jù)集分成若干份,以整型數(shù)0、1、2……進(jìn)行標(biāo)記,即程序的編寫者可以根據(jù)自己的需要對(duì)數(shù)據(jù)進(jìn)行標(biāo)記。
舉例:
package cn.yang.vector
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
/**
* 學(xué)習(xí)MLib的向量標(biāo)簽類型
*/
object Driver02 {
def main(args: Array[String]): Unit = {
val v1 = Vectors.dense(2,3,1)
//創(chuàng)建向量標(biāo)簽。①參:標(biāo)簽值(看作時(shí)因變量Y)②參:向量(看作是所有自變量組成的向量)
//標(biāo)簽值要求的類型是Double,如果是其他的數(shù)值類型,會(huì)隱式轉(zhuǎn)換成Double
val lb1=LabeledPoint(10,v1)
println(lb1.label)//獲取標(biāo)簽值
println(lb1.features)
//練習(xí):處理vectors.txt。前兩列是自變量,第三列是因變量。要求完成轉(zhuǎn)換:
/**
*vectors.txt的數(shù)據(jù)
* 2.1 3.2 1
* 2.2 7.3 2
* 1.1 5.1 1
* 5.2 2.1 1
*/
//RDD[line:String]->RDD[labeledPoint]
val conf =new SparkConf().setMaster("local").setAppName("vector")
val sc = new SparkContext(conf)
val data = sc.textFile("D://data/ml/vectors.txt")
val r1 = data.map{line=>
val info=line.split(" ")
//獲取因變量
val Y=info.last.toDouble
//獲取自變量數(shù)組
val XArr=info.dropRight(1).map{num=>num.toDouble}
LabeledPoint(Y,Vectors.dense(XArr))
}
r1.foreach(println)
}
}
Ⅳ、本地矩陣
大數(shù)據(jù)運(yùn)算中,為了更好地提升計(jì)算效率,可以更多地使用矩陣運(yùn)算進(jìn)行數(shù)據(jù)處理。部署在單機(jī)中的本地矩陣就是一個(gè)很好的存儲(chǔ)方法。
舉一個(gè)簡單的例子,例如一個(gè)數(shù)組Array(1,2,3,4,5,6),將其分為2行3列的矩陣:
package cn.yang.vector
import org.apache.spark.mllib.linalg.Matrices
object Driver {
def main(args: Array[String]): Unit = {
val m1=Matrices.dense(2,3, Array(1,2,3,4,5,6))
println(m1)
}
}
結(jié)果:
1.0 3.0 5.0
2.0 4.0 6.0
從結(jié)果來看,數(shù)組Array(1,2,3,4,5,6)被重組成一個(gè)新的2行3列的矩陣。Matrices.dense方法是矩陣重組的調(diào)用方法,第一個(gè)參數(shù)是新矩陣行數(shù),第二個(gè)參數(shù)是新矩陣的列數(shù),第三個(gè)參數(shù)為傳入的數(shù)據(jù)值。
Ⅴ、分布式矩陣的使用
一般來說,采用分布式矩陣進(jìn)行存儲(chǔ)的情況都是數(shù)據(jù)量非常大的情況
①、行矩陣
行矩陣是最基本的一種矩陣類型。行矩陣是以行作為基本方向的矩陣存儲(chǔ)格式,列的作用相對(duì)較小??梢詫⑵淅斫鉃樾芯仃囀且粋€(gè)巨大的特征向量的集合。每一行就是一個(gè)具有相同格式的向量數(shù)據(jù),且每一行的向量內(nèi)容都可以單獨(dú)取出來進(jìn)行操作。
數(shù)據(jù):
1 2 3
4 5 6
代碼:
import org.apache.spark.mllib.linalg.distributed.RowMatrix object Driver{ def main(args: Array[String]): Unit = { val conf=new SparkConf().setMaster("local").setAppName("vd") val sc=new SparkContext(conf) val data=sc.textFile("d://ml/rowMatrix.txt") //轉(zhuǎn)成RDD,并且行數(shù)據(jù)的格式是Vector val parseData=data.map(_.split(" ").map(_.toDouble)).map(array=>Vectors.dense(array)) //讀入行矩陣 val rm=new RowMatrix(parseData) //打印行數(shù) println(rm.numRows) //打印列數(shù) println(rm.numCols()) } }
②、帶有行索引的行矩陣
單純的行矩陣對(duì)其內(nèi)容無法進(jìn)行直接顯示,當(dāng)然可以通過調(diào)用其方法顯示內(nèi)部數(shù)據(jù)內(nèi)容。有時(shí)候,為了方便在系統(tǒng)調(diào)試的過程中對(duì)行矩陣的內(nèi)容進(jìn)行觀察和顯示,MLlib提供了另外一個(gè)矩陣形式,即帶有行索引的行矩陣。
數(shù)據(jù):
1 2 3
4 5 6
代碼:
package cn.yang.vector import org.apache.spark.mllib.linalg.Matrices import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.mllib.linalg.distributed.IndexedRow import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.linalg.distributed.IndexedRowMatrix object Driver { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local").setAppName("vector") val sc = new SparkContext(conf) val data = sc.textFile("D://data/ml/rowMatrix.txt") var index=0 //轉(zhuǎn)成RDD,并且行數(shù)據(jù)的格式是Vector val parseData=data.map(_.split(" ").map(_.toDouble)) .map(array=>Vectors.dense(array)).map{vector=> index+=1 new IndexedRow(index,vector) } val rm = new IndexedRowMatrix(parseData) //打印矩陣所有的行數(shù)據(jù) rm.rows.foreach {println} //打印指定索引的行數(shù)據(jù) rm.rows.filter { x => x.index==1 }.foreach { x => print(x) } } }
3、MLlib統(tǒng)計(jì)量基礎(chǔ)
Ⅰ、概述
數(shù)理統(tǒng)計(jì)中,基本統(tǒng)計(jì)量包括數(shù)據(jù)的平均值、方差,這是一組求數(shù)據(jù)統(tǒng)計(jì)量的基本內(nèi)容。在MLlib中,統(tǒng)計(jì)量的計(jì)算主要用到Statistics類庫。
類型名稱 |
釋義 |
colStats |
以列為基礎(chǔ)計(jì)算統(tǒng)計(jì)量的基本數(shù)據(jù) |
corr |
對(duì)兩個(gè)數(shù)據(jù)集進(jìn)行相關(guān)系數(shù)計(jì)算,根據(jù)參量的不同,返回值格式有差異 |
Ⅱ、計(jì)算基本統(tǒng)計(jì)量
主要調(diào)用colStats方法,接受的是RDD類型數(shù)據(jù),但是需要注意,它工作和計(jì)算是以列為基礎(chǔ)進(jìn)行計(jì)算,調(diào)用不同方法可獲得不同的統(tǒng)計(jì)計(jì)量值。
方法名稱 |
釋義 |
count |
行內(nèi)數(shù)據(jù)個(gè)數(shù) |
Max |
最大值 |
Min |
最小值 |
Mean |
均值 |
normL1 |
曼哈頓距離 |
normL2 |
歐幾里得距離 |
numNonzeros |
不包含0值的個(gè)數(shù) |
variance |
標(biāo)準(zhǔn)差 |
練習(xí)一:計(jì)算基本統(tǒng)計(jì)量
package cn.yang.vector
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.stat.Statistics
object Driver {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setMaster("local").setAppName("testSummary")
val sc=new SparkContext(conf)
val rdd=sc.textFile("d://data/ml/testSummary.txt").map(_.split(" ").map(_.toDouble)).map(array=>Vectors.dense(array))
//返回一組數(shù)據(jù)的各項(xiàng)基本指標(biāo)
val summary=Statistics.colStats(rdd)
println(summary.mean)//計(jì)算均值
println(summary.variance)//計(jì)算方差
println(summary.max)//最大值
println(summary.min)//最小值
println(summary.count)//行數(shù)
}
}
結(jié)果:
[3.0]
[2.5]
[5.0]
[1.0]
5
練習(xí)二:距離計(jì)算
除了一些基本統(tǒng)計(jì)量的計(jì)算,此方法中還包括兩種距離的計(jì)算,分別是normL1和normL2,代表著曼哈段距離和歐幾里得距離。這兩種距離主要是用以表達(dá)數(shù)據(jù)集內(nèi)部數(shù)據(jù)長度的常用算法。
//接上面代碼
println(summary.normL1)//計(jì)算曼哈頓距離 [15.0]
println(summary.normL2)//計(jì)算歐式距離 [7.416198487095663]
曼哈頓距離:
曼哈段距離用來標(biāo)明兩個(gè)點(diǎn)在標(biāo)準(zhǔn)坐標(biāo)系上的絕對(duì)軸距總和。其公式如下:
x=x1+x2+x3+…+xn
Ⅲ、計(jì)算相關(guān)系數(shù)
相關(guān)系數(shù)是一種用來反映變量之間相關(guān)關(guān)系密切程度的統(tǒng)計(jì)指標(biāo),在現(xiàn)實(shí)中一般用于對(duì)兩組數(shù)據(jù)的擬合和相似程度進(jìn)行定量化分析。常用的一般是皮爾遜相關(guān)系數(shù),MLlib中默認(rèn)的相關(guān)系數(shù)求法也是使用皮爾遜相關(guān)系數(shù)法。
練習(xí):計(jì)算皮爾遜相關(guān)系數(shù)
數(shù)據(jù):
testCorrX.txt
1 2 3 4 5
testCorrY.txt
2 4 7 9 10
package cn.yang.vector
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.stat.Statistics
object Driver {
def main(args: Array[String]): Unit = {
val conf=new SparkConf().setMaster("local").setAppName("testCorrect")
val sc=new SparkContext(conf)
val rddX=sc.textFile("d://data/ml/testCorrX.txt").flatMap(_.split(" ").map(_.toDouble))
val rddY=sc.textFile("d://data/ml/testCorrY.txt").flatMap(_.split(" ").map(_.toDouble))
val correlation:Double=Statistics.corr(rddX,rddY)//計(jì)算兩組數(shù)據(jù)之間的相關(guān)系數(shù)
println(correlation)//0.9877569118027772
}
}
四、距離度量和相似度度量
1、概念
在數(shù)據(jù)分析和數(shù)據(jù)挖掘的過程中,我們經(jīng)常需要知道個(gè)體間差異的大小,進(jìn)而評(píng)價(jià)個(gè)體的相似性和類別。而如何來度量數(shù)據(jù)之間的差異則成為關(guān)鍵,分類算法或聚類算法的本質(zhì)都是基于某種度量(距離度量和相似度度量)來實(shí)現(xiàn)的。
距離度量:用于衡量個(gè)體在空間上存在的距離,距離越遠(yuǎn)說明個(gè)體間的差異越大。
1.歐氏距離
2.明可夫斯基距離
3.曼哈頓距離
4.切比雪夫距離
5.馬氏距離
相似度度量:
1.向量空間余弦相似度(Cosine Similarity)
2.皮爾森相關(guān)系數(shù)(Pearson Correlation Coefficient)
2、歐氏距離
在二維和三維空間中的歐氏距離的就是兩點(diǎn)之間的距離。
二維空間的歐氏距離:
二維平面上兩點(diǎn)a(x1,y1)與b(x2,y2)間的歐氏距離:
三維空間兩點(diǎn)a(x1,y1,z1)與b(x2,y2,z2)間的歐氏距離:
兩個(gè)n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的歐氏距離:
也可以用表示成向量運(yùn)算的形式:
3、曼哈頓距離
可以理解為出租車距離,出租車到目的地的最短距離。
紅線代表曼哈頓距離,綠色代表歐氏距離,也就是直線距離;
藍(lán)色和黃色代表等價(jià)的曼哈頓距離。
曼哈頓距離--兩點(diǎn)在南北方向上的距離加上在東西方向上的距離,即:
d(i,j)=|xi-xj|+|yi-yj|
?例如:在平面上。坐標(biāo)(x1,y1)的i點(diǎn)與坐標(biāo)(x2,y2)的j點(diǎn)的曼哈頓距離為:
d(i,j)=|x1-x2|+|y1-y2|
package cn.yang.vector
object Driver {
def main(args: Array[String]): Unit = {
val p1=Array(2,1,5)
val p2=Array(5,10,3)
//計(jì)算出兩個(gè)點(diǎn)之間的曼哈頓距離
val p1p2=p1 zip p2 //拉鏈
p1p2.foreach(println)
/**
* (2,5)
* (1,10)
* (5,3)
*/
val dis1=p1p2.map{x=>Math.abs(x._1-x._2)}.sum
println(dis1)//14
}
}
4、切比雪夫距離
切比雪夫距離,我們可以理解為國王到目的地走的最少步數(shù)。
最少步數(shù)總是max(|x2-x1|,|y2-y1|)步?
//計(jì)算出兩個(gè)點(diǎn)之間的切比雪夫距離
val dis2=p1p2.map{x=>Math.abs(x._1-x._2)}.max
println(dis2)//9
五、最小二乘法
1、簡介
最小二乘法(又稱最小平方法)是一種數(shù)學(xué)優(yōu)化技術(shù)。它通過最小化誤差的平方和尋找數(shù)據(jù)的最佳函數(shù)匹配。利用最小二乘法可以簡便地求得未知的數(shù)據(jù),并使得這些求得的數(shù)據(jù)與實(shí)際數(shù)據(jù)之間誤差的平方和為最小。最小二乘法還可用于曲線擬合。其他一些優(yōu)化問題也可通過最小化能量或最大化熵用最小二乘法來表達(dá)。
2、原理及推導(dǎo)
我們來看一下最簡單的線性情況。
對(duì)于某個(gè)數(shù)據(jù)集(xi, yi) (i=0,1,…,n),我們需要找到一條趨勢線(圖中的虛線),能夠表達(dá)出數(shù)據(jù)集(xi,?yi)這些點(diǎn)所指向的方向。
我們先用一個(gè)直線函數(shù)表示這條趨勢線:
Y=KX+b
數(shù)據(jù)集的點(diǎn)一定位于這條趨勢線的上下兩側(cè),或者與趨勢線重合。我們把某個(gè)樣本點(diǎn)xi到這條趨勢線的垂直距離定義為殘差ξi,那么過這一點(diǎn)與趨勢線平行的樣本函數(shù)為yi=kxi+b+ξi。如果這個(gè)樣本點(diǎn)位于趨勢線的上側(cè),在殘差ξi>0,反之則ξi<0,如果樣本點(diǎn)位于趨勢線上則ξi=0。
現(xiàn)在,我們求解這條趨勢線。因?yàn)槭蔷€性函數(shù),所以也就是求解k、b這兩個(gè)值。
下面我們將帶有殘差的直線函數(shù)修改為下面的形式:
ξi=yi-kxi-b
因?yàn)闅埐瞀蝘有正負(fù)號(hào)的問題,所以我們統(tǒng)一用平方和來計(jì)算,即殘差平方和:
很明顯這個(gè)二次函數(shù)是一個(gè)凸函數(shù)(單峰函數(shù)),我們接下來對(duì)該函數(shù)求極值,即它的一階導(dǎo)數(shù)等于0。
接下來,將兩個(gè)方程聯(lián)立,我們令:
解得a、b的值為:
上式中,x與y都已知,所以可求得k,b。
3、案例練習(xí)
某種商品的需求量(y,噸)、價(jià)格(x1,元/千克)和消費(fèi)者收入(x2,元)觀測值如下表所示。
y=β1X1+β2X2+β0 ?
y |
x1 |
x2??? |
100 |
5 |
1000 |
75 |
7 |
600 |
80 |
6 |
1200 |
70 |
6 |
500 |
50 |
8 |
30 |
65 |
7 |
400 |
90 |
5 |
1300 |
100 |
4 |
1100 |
110 |
3 |
1300 |
60 |
9 |
300 |
為了能夠通過Mllib建模,我們首先需要對(duì)數(shù)據(jù)格式進(jìn)行一定的處理,比如如下所示:
100|5 1000 |
75|7 600 |
80|6 1200 |
70|6 500 |
50|8 30 |
65|7 400 |
90|5 1300 |
100|4 1100 |
110|3 1300 |
60|9 300 |
預(yù)測:X1=10 X2=400 Y=?
思路:
基于已收集的數(shù)據(jù),建立目標(biāo)方程:
y=β1X1+β2X2+β0 ?
然后通過最小二乘法求解出目標(biāo)方程的最優(yōu)系數(shù)解(β0,β1,β2??)
最后通過此方程完成預(yù)測:
代碼:
package cn.yang.lr
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.ml.regression.LinearRegression
/**
* 本案例是建立多元線性回歸模型,用于預(yù)測商品的需求量
* 模型方程:Y=β1X1+β2X2+β0
* 底層通過最小二乘解出最優(yōu)的系數(shù)解,從而利用此方程完成數(shù)據(jù)的預(yù)測
*/
object Driver {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("lr")
val sc = new SparkContext(conf)
//創(chuàng)建SaprkSql上下文對(duì)象,用于創(chuàng)建或轉(zhuǎn)換DataFrame
val sqc = new SQLContext(sc)
val data = sc.textFile("D://data/ml/lritem.txt")
//第一步:RDD[line:String]->RDD[(x1,x2,y)]
val r1 = data.map{line =>
val info =line.split("\\|")
val Y=info(0).toDouble
val X1=info(1).split(" ")(0).toDouble
val X2=info(1).split(" ")(1).toDouble
(X1,X2,Y)
}
// r1.foreach(println)
//第二步,為了滿足建模需要,RDD[(X1,X2,Y)]->DataFrame(X1,X2,Y) 數(shù)據(jù)表類型也叫數(shù)據(jù)框
//RDD轉(zhuǎn)成DataFrame的要求:RDD中每個(gè)元素必須是元組類型,而且DataFrame的列的個(gè)數(shù)以及順序要和元組一致
val df1 = sqc.createDataFrame(r1).toDF("X1","X2","Y")
//df1.show()
//第三步:DataFrame(X1,X2,Y)->DataFrame(Vector(X1,X2),Y)這是模型最終要的數(shù)據(jù)結(jié)構(gòu)
//new VectorAssembler()向量轉(zhuǎn)換工具類
//setInputCols:指定自變量的列名
//setOutputCol:為所有的自變量起一個(gè)別名,后續(xù)建??梢酝ㄟ^這個(gè)別名找到所有自變量的列
val vectorAss= new VectorAssembler().setInputCols(Array("X1","X2"))
.setOutputCol("features")
val df1Vectors=vectorAss.transform(df1)
//第四步:通過Saprk的MLlib庫建立多元回歸模型
//setFeaturesCol:通過別名指定哪些列是自變量列
//setLabelCol:指定因變量的列名
//setFitIntercept(true):表示計(jì)算截距項(xiàng)系數(shù)。截距項(xiàng)系數(shù)可以不計(jì)算,但自變量的系數(shù)必須要計(jì)算
//fit:代入數(shù)據(jù)建模
val model = new LinearRegression().setFeaturesCol("features")
.setLabelCol("Y")
.setFitIntercept(true)
.fit(df1Vectors)
//獲取自變量系數(shù)值
val coef = model.coefficients
//獲取截距項(xiàng)系數(shù)值
val intercept= model.intercept
println(coef)
println(intercept)
//Y=-6.497X1+0.016X2+106.369
//第五步:通過模型實(shí)現(xiàn)預(yù)測
//回代樣本集
val predictResult=model.transform(df1Vectors)
predictResult.show
//給定一組數(shù)據(jù) X1=10 X2=500 利用模型預(yù)測出Y=?
//RDD[(X1,X2,Y)]->DataFrame("X1","X2","Y")->DataFrame(Vector(X1,X2),Y)->model.transform 完成預(yù)測
//因?yàn)槟P皖A(yù)測是根據(jù)自變量做預(yù)測,和Y沒關(guān)系,所以封裝數(shù)據(jù)時(shí),Y可以取任意值。
val testRDD = sc.makeRDD(List((10,500,0)))
val df2 = sqc.createDataFrame(testRDD).toDF("X1","X2","Y")
val df1Vectors1=vectorAss.transform(df2)
val predictResult1=model.transform(df1Vectors1)
predictResult1.show
//第六步:模型的檢驗(yàn)
//獲取模型的多元R2值,這個(gè)指標(biāo)可以評(píng)估模型的優(yōu)良性,最大值1,越趨近1,表示模型對(duì)于數(shù)據(jù)的擬合越好
//在生產(chǎn)環(huán)境下,R2在0.55以上都可以接受
val R2 = model.summary.r2
println(R2)
}
}
結(jié)果:
4、多元線性回歸模型的細(xì)節(jié)說明
①、多元,可以理解為建立的目標(biāo)方程中有多個(gè)(大于1個(gè))自變量
比如Y=β1X1+β2X2+β0
②、一元,可以理解為建立的目標(biāo)方程中只有1個(gè)自變量
比如Y=β1X1+β0
③、線性,可以理解為建立的目標(biāo)方程式線性方程
比如直線方程,平面方程,超平面方程都屬于線性方程
直線方程:Y=β1X1+β0
平面方程:Y=β1X1+β2X2+β0
在更高維(超過三維)中的超平面方程:Y=β1X1+β2X2+...+βnXn+β0
可以的得到一個(gè)結(jié)論:線性方程的形式式已知的(固定的)
④、非線性,可以理解為建立的目標(biāo)方程是非線性方程,比如圓、橢圓方程等
一般習(xí)慣是是使用線性方程來集合數(shù)據(jù),因?yàn)榫€性方程的形式固定,容易求解,
而非線性方程形式不固定,很難求解
⑤、回歸模型,可以理解通過這種模型,可以解決一類問題?;貧w模型用于解決預(yù)測問題。
在機(jī)器學(xué)習(xí)中的模型有:
回歸模型,正則化模型,決策樹模型,集成模型,聚類模型,分類(判別)模型
SVM模型,貝葉斯模型,降維模型,圖模型,關(guān)聯(lián)規(guī)則模型,推薦模型,
神經(jīng)網(wǎng)絡(luò)模型,深度學(xué)習(xí)模型
⑥、算法,可以理解為通過某種算法求解模型方程中的系數(shù)文章來源:http://www.zghlxwxcb.cn/news/detail-468356.html
最小二乘法,梯度下降法,路徑積分法,模擬退火算法...文章來源地址http://www.zghlxwxcb.cn/news/detail-468356.html
到了這里,關(guān)于大數(shù)據(jù)筆記--Spark機(jī)器學(xué)習(xí)(第一篇)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!