大數(shù)據(jù)分析原理和應(yīng)用 課件 第6-8章 大數(shù)據(jù)的獲取和預(yù)處理、大數(shù)據(jù)分析算法、大數(shù)據(jù)分析的應(yīng)用案例_第1頁
大數(shù)據(jù)分析原理和應(yīng)用 課件 第6-8章 大數(shù)據(jù)的獲取和預(yù)處理、大數(shù)據(jù)分析算法、大數(shù)據(jù)分析的應(yīng)用案例_第2頁
大數(shù)據(jù)分析原理和應(yīng)用 課件 第6-8章 大數(shù)據(jù)的獲取和預(yù)處理、大數(shù)據(jù)分析算法、大數(shù)據(jù)分析的應(yīng)用案例_第3頁
大數(shù)據(jù)分析原理和應(yīng)用 課件 第6-8章 大數(shù)據(jù)的獲取和預(yù)處理、大數(shù)據(jù)分析算法、大數(shù)據(jù)分析的應(yīng)用案例_第4頁
大數(shù)據(jù)分析原理和應(yīng)用 課件 第6-8章 大數(shù)據(jù)的獲取和預(yù)處理、大數(shù)據(jù)分析算法、大數(shù)據(jù)分析的應(yīng)用案例_第5頁
已閱讀5頁,還剩254頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第六章大數(shù)據(jù)的獲取和預(yù)處理本章學(xué)習(xí)目標(biāo)1.掌握爬蟲的基本概念和流程,并使用Scrapy實(shí)現(xiàn)數(shù)據(jù)爬蟲;2.掌握數(shù)據(jù)清洗的基本原理和流程,并使用Pandas實(shí)現(xiàn)數(shù)據(jù)清洗;3.了解并掌握數(shù)據(jù)規(guī)約的基本概念和操作;4.了解并掌握數(shù)據(jù)標(biāo)準(zhǔn)化的基本概念和方法。6.1.1爬蟲的基礎(chǔ)知識(shí)1.HTTP基本原理 HTTP協(xié)議(HyperTextTransferProtocol,超文本傳輸協(xié)議)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù),是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。該協(xié)議工作于客戶端-服務(wù)器架構(gòu)上,瀏覽器作為HTTP客戶端通過URL向HTTP服務(wù)端即Web服務(wù)器發(fā)送所有請(qǐng)求,Web服務(wù)器根據(jù)收到的請(qǐng)求,向客戶端發(fā)送響應(yīng)信息。6.1.1爬蟲的基礎(chǔ)知識(shí)(1)HTTP基本原理——HTTP請(qǐng)求報(bào)文當(dāng)客戶端發(fā)送一個(gè)請(qǐng)求后,一般都會(huì)得到一個(gè)服務(wù)器的響應(yīng)。服務(wù)器發(fā)送給客戶端的HTTP響應(yīng)用于向客戶端提供起請(qǐng)求的資源,以及客戶端請(qǐng)求的執(zhí)行結(jié)果。與請(qǐng)求類似,HTTP響應(yīng)也同樣由四部分組成,分別為響應(yīng)行、響應(yīng)頭、空行和響應(yīng)體。6.1.1爬蟲的基礎(chǔ)知識(shí)(2)HTTP基本原理——HTTP響應(yīng)報(bào)文當(dāng)客戶端發(fā)送一個(gè)請(qǐng)求后,一般都會(huì)得到一個(gè)服務(wù)器的響應(yīng)。服務(wù)器發(fā)送給客戶端的HTTP響應(yīng)用于向客戶端提供起請(qǐng)求的資源,以及客戶端請(qǐng)求的執(zhí)行結(jié)果。與請(qǐng)求類似,HTTP響應(yīng)也同樣由四部分組成,分別為響應(yīng)行、響應(yīng)頭、空行和響應(yīng)體。6.1.1爬蟲的基礎(chǔ)知識(shí)1.HTML和Xpath基礎(chǔ) HTML(HypertextMarkupLanguage,超文本標(biāo)記語言)是一種標(biāo)記語言,包括一系列標(biāo)簽,利用這些標(biāo)簽可以將網(wǎng)絡(luò)上的格式統(tǒng)一,從而使得分散的Internet資源連接為一個(gè)邏輯整體。HTML用于顯示信息,而傳輸和存儲(chǔ)信息則是使用XML(ExtensibleMarkupLanguage,可擴(kuò)展標(biāo)記語言)。XML由XML元素組成,每個(gè)XML元素包括一個(gè)開始標(biāo)記,一個(gè)結(jié)束標(biāo)記以及兩個(gè)標(biāo)記之間的內(nèi)容??捎脕順?biāo)記數(shù)據(jù)、定義數(shù)據(jù)類型等。Xpath(XMLPathLanguage,XML路徑語言)是在XML文檔中查找信息的語言,但同樣也適用于HTML文檔的搜索。6.1.1爬蟲的基礎(chǔ)知識(shí)(1)HTML和Xpath基礎(chǔ)——HTML元素 HTML是一種用來結(jié)構(gòu)化Web網(wǎng)頁及其內(nèi)容的標(biāo)記語言。網(wǎng)頁內(nèi)容可以是:一組段落、一個(gè)消息列表,也可以含有圖片和數(shù)據(jù)表。HTML由一系列元素組成,這些元素可用來包圍不同部分的內(nèi)容,使其以某種方式呈現(xiàn)或工作。一對(duì)標(biāo)簽可以為一段文字或一張圖片添加超鏈接,將文字設(shè)置為斜體,改編字號(hào)等。元素主要包含以下幾部分:開始標(biāo)簽(Openingtag):包含元素的名稱(本例為p),被大于號(hào)、小于號(hào)所包圍。結(jié)束標(biāo)簽(Closingtag):與開始標(biāo)簽類似,只是在其元素名之前包含了一個(gè)斜杠,這表示元素的結(jié)尾;內(nèi)容(Content):元素的內(nèi)容,本例中就是所輸入的文本:“我的院子里有兩棵樹;”元素(Element):開始標(biāo)簽、結(jié)束標(biāo)簽與內(nèi)容相結(jié)合,就是完整的元素。6.1.1爬蟲的基礎(chǔ)知識(shí)(2)HTML和Xpath基礎(chǔ)——HTML文檔

以上介紹了基本的HTML元素,現(xiàn)分析完整的HTML頁面,示例如下:6.1.1爬蟲的基礎(chǔ)知識(shí)(3)HTML和Xpath基礎(chǔ)——樹表示法

瀏覽器發(fā)送請(qǐng)求后,會(huì)收到服務(wù)器響應(yīng)的HTML文檔,其后,瀏覽器需要對(duì)其進(jìn)行解析,從而將HTML文檔轉(zhuǎn)換為常見的網(wǎng)頁。解析主要分為三大步驟:DOM改造、布局以及繪制頁面。DOM表示法(DocumentObjectModel,文檔對(duì)象模型)具有跨平臺(tái)、語言無關(guān)等特點(diǎn),并且被大多數(shù)瀏覽器所支持,是W3C組織推薦的處理可擴(kuò)展標(biāo)記語言(HTML或XML)的標(biāo)準(zhǔn)編程接口。 DOM可以將HTML文檔解析為一個(gè)由節(jié)點(diǎn)和對(duì)象(包含屬性和方法的對(duì)象)組成的結(jié)構(gòu)集合,即HTML代碼的樹表示法。這種對(duì)象模型決定了節(jié)點(diǎn)之間都有一定的關(guān)聯(lián),如父子、兄弟等。6.1.1爬蟲的基礎(chǔ)知識(shí)(3)HTML和Xpath基礎(chǔ)——樹表示法

6.1.1爬蟲的基礎(chǔ)知識(shí)(3)HTML和Xpath基礎(chǔ)——樹表示法其對(duì)應(yīng)的DOM樹表示如下:

6.1.1爬蟲的基礎(chǔ)知識(shí)3.正則表達(dá)式

正則表達(dá)式是用于描述一組字符串特征的模式,用來匹配特點(diǎn)的字符串。通過“特殊字符串+普通字符”來進(jìn)行模式描述,從而達(dá)到文本匹配目的的工具。正則表達(dá)式可在許多語言中使用,無論是前端的JavaScript、還是后端的Java、Python,它們都提供相應(yīng)的接口/函數(shù)支持正則表達(dá)式。

6.1.1爬蟲的基礎(chǔ)知識(shí)3.正則表達(dá)式

正則表達(dá)式中有一些重復(fù)限定符,把重復(fù)部分用合適的限定符替代,常用的如下表所示:

6.1.1爬蟲的基礎(chǔ)知識(shí)4.爬蟲的概念

簡(jiǎn)單來說,爬蟲就是模擬瀏覽器發(fā)送網(wǎng)絡(luò)請(qǐng)求,獲取請(qǐng)求響應(yīng),獲取網(wǎng)頁并提取和保存信息的自動(dòng)化程序。自動(dòng)化程序是指使用爬蟲來代替人來完成這些操作,而爬蟲就是代替人來完成爬取工作的自動(dòng)化程序,它可以在抓取過程中進(jìn)行各種異常處理、錯(cuò)誤重試等操作,確保爬取高效地運(yùn)行。具體介紹如下:

6.1.1爬蟲的基礎(chǔ)知識(shí)(1)爬蟲的基本概念-獲取網(wǎng)頁

爬蟲首先要做的就是獲取網(wǎng)頁,即網(wǎng)頁的源代碼,其中包含了網(wǎng)頁的有效信息,因此只要把源代碼獲取下來,就可以從中提取到有用信息。

所謂請(qǐng)求,就是由客戶端發(fā)送給服務(wù)器的信息,從而獲取消息,服務(wù)器返回的響應(yīng)便是網(wǎng)頁源代碼。因此,爬蟲的關(guān)鍵就是構(gòu)造一個(gè)請(qǐng)求并發(fā)送給服務(wù)器,然后接收到響應(yīng)并將其解析出來。 Python提供了許多庫幫助我們實(shí)現(xiàn)構(gòu)造請(qǐng)求和解析響應(yīng),如urllib、requests等。通常人們使用這些庫來實(shí)現(xiàn)HTTP請(qǐng)求操作,請(qǐng)求和響應(yīng)都使用類庫提供的數(shù)據(jù)結(jié)構(gòu)表示,得到響應(yīng)之后只需要解析數(shù)據(jù)結(jié)構(gòu)中的Body部分,就可以得到網(wǎng)頁的源代碼。

6.1.1爬蟲的基礎(chǔ)知識(shí)(2)爬蟲的基本概念-提取信息

獲得網(wǎng)頁源代碼后,需要做的就是分析源代碼,從中提取到我們感興趣的信息。首先,最常用的方法是采用正則表達(dá)式提取,但是在構(gòu)造正則表達(dá)式時(shí)比較復(fù)雜且容易出錯(cuò)。

另外,由于網(wǎng)頁的結(jié)構(gòu)有一定的規(guī)則,因此可以利用從網(wǎng)頁節(jié)點(diǎn)屬性或XPath來提取網(wǎng)頁信息的庫,如BeautifulSoup、pyquery、lxml等,使用這些庫,可以高效地從中提取到有用地網(wǎng)頁信息,如節(jié)點(diǎn)的屬性、文本值等;

6.1.1爬蟲的基礎(chǔ)知識(shí)(3)爬蟲的基本概念-保存數(shù)據(jù)

提取信息以后,我們一般將提取到的數(shù)據(jù)保存到某處以便后續(xù)使用。保存形式有很多,如簡(jiǎn)單保存為TXT文本或JSON文本,也可以保存到數(shù)據(jù)庫,如MySQL和MongoDB等,也可以保存到遠(yuǎn)程服務(wù)器,如借助SFTP進(jìn)行操作等;

6.1.2Scrapy爬蟲的原理與流程Scrapy框架介紹

6.1.2Scrapy爬蟲的原理與流程Scrapy框架介紹Engine:即引擎,處理整個(gè)系統(tǒng)的數(shù)據(jù)流處理,是Scrapy框架的核心,負(fù)責(zé)控制數(shù)據(jù)流在系統(tǒng)中所有組件中的流動(dòng),并在相應(yīng)動(dòng)作發(fā)生時(shí)觸發(fā)事件;Scheduler:即調(diào)度器,接受引擎發(fā)過來的請(qǐng)求,并將其加入隊(duì)列中,在引擎再次請(qǐng)求時(shí)將請(qǐng)求提供給引擎;Downloader:即下載器,用于高速下載網(wǎng)頁內(nèi)容,并將下載內(nèi)容返回給spider;

6.1.2Scrapy爬蟲的原理與流程Scrapy框架介紹Spiders:即爬蟲,定義爬取的邏輯和網(wǎng)頁內(nèi)容的解析規(guī)則,主要負(fù)責(zé)解析響應(yīng)并生成結(jié)果和新的請(qǐng)求;ItemPipeline:即項(xiàng)目管道,負(fù)責(zé)處理spider從網(wǎng)頁中抽取的數(shù)據(jù),主要是負(fù)責(zé)清洗,驗(yàn)證和向數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù);DownloaderMiddlewares:即下載中間件,是處于Scrapy的Request和Requesponse之間的處理模塊;SpiderMiddlewares:即spider中間件,位于引擎和spider之間的框架,主要處理spider輸入的響應(yīng)和輸出的結(jié)果及新的請(qǐng)求實(shí)現(xiàn)。

6.1.2Scrapy爬蟲的原理與流程2.Scrapy工作流程

當(dāng)Spider要爬取某URL地址的頁面時(shí),首先用該URL構(gòu)造一個(gè)Request對(duì)象,提交給Engine(圖6-4中的①),隨后Request對(duì)象進(jìn)入Scheduler,按照某種算法排隊(duì),之后的某個(gè)時(shí)候從隊(duì)列中出來,由Engine提交給Downloader(圖6-4中的②、③、④)。Downloader根據(jù)Request對(duì)象中的URL地址發(fā)送一次HTTP請(qǐng)求到目標(biāo)網(wǎng)站服務(wù)器,并接受服務(wù)器返回的HTTP響應(yīng),構(gòu)建一個(gè)Response對(duì)象(圖6-4中的⑤),并由Engine將Response提交給Spider(圖6-4中的⑥),Spider提取Response中的數(shù)據(jù),構(gòu)造出Item對(duì)象或根據(jù)新的連接構(gòu)造出Request對(duì)象,分別由Engine提交給ItemPipeline或者Scheduler(圖6-4中的⑦、⑧)。這個(gè)過程反復(fù)進(jìn)行,直到爬完所有數(shù)據(jù)。同時(shí),數(shù)據(jù)對(duì)象在出入Spider和Downloader時(shí)可能會(huì)經(jīng)過Middleware進(jìn)行進(jìn)一步的處理。

6.2數(shù)據(jù)清洗

大數(shù)據(jù)時(shí)代,數(shù)據(jù)必須經(jīng)過清洗、分析、建模、可視化才能體現(xiàn)其價(jià)值,由于數(shù)據(jù)集是面向某一主題的數(shù)據(jù)的集合,這些數(shù)據(jù)從多個(gè)數(shù)據(jù)源提取出來,這樣就避免不了有的數(shù)據(jù)是錯(cuò)誤數(shù)據(jù),有的數(shù)據(jù)相互之間有沖突,這些錯(cuò)誤或有沖突的數(shù)據(jù)一般是使用者不想要的,稱為“臟數(shù)據(jù)”,按照一定的原理和規(guī)則把“臟數(shù)據(jù)”“洗掉”,就是數(shù)據(jù)清洗。具體來說,數(shù)據(jù)清洗主要包括檢查數(shù)據(jù)一致性,處理無效值和缺失值等。其目的在于刪除重復(fù)信息、糾正存在的錯(cuò)誤,從而提高數(shù)據(jù)質(zhì)量。

6.2.1數(shù)據(jù)清洗概述一致性檢查

一致性檢查是根據(jù)每個(gè)變量的合理取值范圍和相互關(guān)系,檢查數(shù)據(jù)是否合乎要求,發(fā)現(xiàn)超出正常范圍、邏輯上不合理或者相互矛盾的數(shù)據(jù)。例如,體重出現(xiàn)了負(fù)數(shù),性別中除了“Male”、“Female”還出現(xiàn)了數(shù)字“25”等,這些都應(yīng)被視為超出正常值域范圍。

一般計(jì)算機(jī)軟件都能夠自動(dòng)識(shí)別每個(gè)變量中超出范圍的取值,并列出調(diào)查對(duì)象代碼、變量代碼、變量名及超出范圍的取值,這樣做可以系統(tǒng)地檢查每個(gè)變量。

6.2.1數(shù)據(jù)清洗概述2.無效值和缺失值的處理估算:用某個(gè)變量的樣本均值、中位數(shù)或眾數(shù)代替無效值和缺失值,另一種方法是根據(jù)調(diào)查對(duì)象對(duì)其他問題的答案,通過變量之間的相關(guān)分析或邏輯推論進(jìn)行估計(jì)。整例刪除:剔除含有缺失值的樣本,只適合關(guān)鍵變量缺失,或者含有無效值或缺失值的樣本比重很小的情況。變量刪除:如果某一變量的無效值和缺失值很多,而且該變量對(duì)于所研究的問題不是特別重要,則可以考慮將變量刪除,這種做法減少了供分析用的變量數(shù)目,但沒有改變樣本量。成對(duì)刪除:用特殊碼(通常是9、99、999等)表示無效值和缺失值,同時(shí)保留數(shù)據(jù)集中的全部變量和樣本。

6.2.2數(shù)據(jù)清洗概述1.預(yù)處理階段

預(yù)處理階段主要工作內(nèi)容有兩點(diǎn):一個(gè)是將數(shù)據(jù)導(dǎo)入處理工具,常見的有導(dǎo)入數(shù)據(jù)庫,如果數(shù)據(jù)量大,可以采用文本文件存儲(chǔ)。另外一個(gè)就是分析原始數(shù)據(jù),這里包含兩個(gè)部分:一是看元數(shù)據(jù),包括字段解釋、數(shù)據(jù)來源、代碼表等一切描述數(shù)據(jù)的信息;二是抽取一部分?jǐn)?shù)據(jù),使用人工查看方式,對(duì)數(shù)據(jù)本身有一個(gè)直觀的了解,并且初步發(fā)現(xiàn)一些問題,為之后的處理做準(zhǔn)備。

6.2.2數(shù)據(jù)清洗概述2.缺失值清洗缺失值是最常見的數(shù)據(jù)問題,處理方式多按照以下三步進(jìn)行:確定缺失值范圍:對(duì)每個(gè)字段都計(jì)算其缺失值比例,然后按照缺失比例和字段重要性,分別制定策略;去除不需要的字段:將缺失比例較高的字段直接整例刪除,建議刪除前進(jìn)行數(shù)據(jù)備份,或者在小規(guī)模數(shù)據(jù)上試驗(yàn)通過后再處理全量數(shù)據(jù);填充缺失內(nèi)容:某些缺失值可進(jìn)行填充,方法有以下三種:以業(yè)務(wù)知識(shí)或經(jīng)驗(yàn)推敲填充缺失值以同一指標(biāo)的計(jì)算結(jié)果(均值、中位數(shù)、眾數(shù)等)填充缺失值以不同指標(biāo)的計(jì)算結(jié)果填充缺失值

6.2.2數(shù)據(jù)清洗概述3.格式內(nèi)容清洗

如果數(shù)據(jù)是由系統(tǒng)日志而來,那么通常在格式和內(nèi)容方面,會(huì)與元數(shù)據(jù)的描述一致,而如果數(shù)據(jù)是由人工手記或用戶填寫而來,則有很大可能性在格式和內(nèi)容上存在問題,簡(jiǎn)單來說,格式內(nèi)容問題有以下幾類:時(shí)間、日期、數(shù)值、全半角等顯示格式不一致:這種問題通常與輸入端有關(guān),在整合多源數(shù)據(jù)時(shí)也有可能遇到,將其處理成一致的某種格式即可;內(nèi)容中有不該存在的字符:某些內(nèi)容可能只包括一部分字符,例如:性別是“男”或“女”,身份證號(hào)是數(shù)字+字母,如果出現(xiàn)姓別中出現(xiàn)數(shù)字符號(hào)、身份證號(hào)中出現(xiàn)漢字等問題,這種情況需要以半自動(dòng)校驗(yàn)人工方式來找出可能存在的問題,并去除不需要的字符;內(nèi)容與該字段應(yīng)有內(nèi)容不符:姓名寫了性別,身份證號(hào)寫了手機(jī)號(hào)等等,均屬這種問題。

6.2.2數(shù)據(jù)清洗概述4.邏輯錯(cuò)誤清洗

這部分工作是去掉一些使用簡(jiǎn)單邏輯推理就可以直接發(fā)現(xiàn)問題的數(shù)據(jù),防止分析結(jié)果與事實(shí)偏差太大,主要包含以下幾個(gè)步驟:數(shù)據(jù)去重:所謂去重,就是刪除掉重復(fù)的記錄信息。將去重放在格式內(nèi)容清洗之后,這樣做的好處是可以通過對(duì)比快速確定正確信息;去除不合理值:針對(duì)不合理值,常用的方法就是按照缺失值處理,另外,通過箱型圖可快速發(fā)現(xiàn)不合理值;去除不可靠的字段值:如果在填寫數(shù)據(jù)時(shí)由于人為因素導(dǎo)致填寫錯(cuò)誤,那么可通過該步驟來清除;對(duì)來源不可靠的數(shù)據(jù)重點(diǎn)關(guān)注:如果數(shù)據(jù)來源不能確定,則該數(shù)據(jù)應(yīng)該及時(shí)清除或重新獲取。

6.2.2數(shù)據(jù)清洗概述5.多余數(shù)據(jù)清洗

在清洗不需要的數(shù)據(jù)時(shí),需要人們盡可能多地收集數(shù)據(jù),并應(yīng)用于模型構(gòu)建中。但是有可能在實(shí)際開發(fā)中字段屬性越多,模型地構(gòu)建就會(huì)越慢,因此有時(shí)需要將不必要的字段刪除,以達(dá)到最好的模型效果。

6.2.2數(shù)據(jù)清洗概述6.關(guān)聯(lián)性驗(yàn)證

如果數(shù)據(jù)有多個(gè)來源,那么有必要進(jìn)行關(guān)聯(lián)性驗(yàn)證,例如,某位顧客曾通過電話咨詢過商品信息,同時(shí)也可以在實(shí)體店試用記錄中查找到該用戶的基本信息,那么,兩條記錄可通過顧客姓名和手機(jī)號(hào)關(guān)聯(lián),然后進(jìn)行調(diào)整或去除數(shù)據(jù)。

6.3數(shù)據(jù)規(guī)約

對(duì)大規(guī)模數(shù)據(jù)庫內(nèi)容進(jìn)行復(fù)雜的數(shù)據(jù)分析通常要耗費(fèi)大量的時(shí)間,數(shù)據(jù)規(guī)約技術(shù)可幫助從原有的龐大數(shù)據(jù)集中獲得一個(gè)精簡(jiǎn)的數(shù)據(jù)集合,并使這一精簡(jiǎn)數(shù)據(jù)集保持原有數(shù)據(jù)集的完整性,這樣在精簡(jiǎn)數(shù)據(jù)集上進(jìn)行數(shù)據(jù)分析顯然效率更高,并且分析出來的結(jié)果與使用原有數(shù)據(jù)集所獲得結(jié)果基本相同。數(shù)據(jù)規(guī)約標(biāo)準(zhǔn)為:用于數(shù)據(jù)規(guī)約的時(shí)間不應(yīng)當(dāng)超過或“抵消”在規(guī)約后的數(shù)據(jù)上挖掘節(jié)省的時(shí)間規(guī)約得到的數(shù)據(jù)比原數(shù)據(jù)小得多,但可以產(chǎn)生相同或幾乎相同的分析結(jié)果。

6.3.1維規(guī)約逐步向前選擇:從一個(gè)空屬性集開始,該集合作為屬性子集的初始值,每次從原屬性集中選擇一個(gè)當(dāng)前最優(yōu)的屬性添加到屬性子集中,迭代地選出最優(yōu)屬性并添加,直至無法選出最優(yōu)為止。2.逐步向后刪除:從一個(gè)擁有所有屬性的屬性集開始,該集合是屬性子集的初始值,每

次從當(dāng)前子集中選擇一個(gè)當(dāng)前最差的屬性并將其從屬性子集中刪除,迭代地選出最差屬性并刪除,直至無法選出最差為止。3.向前選擇與向后刪除結(jié)合:可以將向前選擇和向后刪除的方法結(jié)合在一起,每一步選擇一個(gè)最好的屬性,并在剩余屬性中刪除一個(gè)最差的屬性。

6.3.2維規(guī)約主成分分析

在很多情況下,變量之間存在一定的相關(guān)關(guān)系,這種相關(guān)關(guān)系,可以解釋為變量之間有重疊。主成分分析(PrincipalComponentAnalysis,PCA)是指使用較少的變量去解釋原始數(shù)據(jù)中的大部分變量,即將許多相關(guān)性很高的變量轉(zhuǎn)化成彼此相互獨(dú)立或不相關(guān)的變量。具體來說,PCA就是從原始的空間中順序地找一組相互正交的坐標(biāo)軸,其中,第一個(gè)坐標(biāo)軸選擇的是原始數(shù)據(jù)中方差最大的方向,第二個(gè)坐標(biāo)軸選取的是與第一個(gè)坐標(biāo)軸正交的平面中方差最大的,以此類推,直到得到n個(gè)這樣的坐標(biāo)軸2.合并屬性

合并屬性就是將一些舊屬性合并為新屬性,例如初始屬性集為{A1,A2,A3,A4,B1,B2,B3,C},然后將{A1,A2,A3,A4}合并為屬性A,將{B1,B2,B3}合并為B,因此規(guī)約后屬性集變?yōu)閧A,B,C}。

6.3.2離散化方法離散化方法可用于數(shù)據(jù)轉(zhuǎn)換。把連續(xù)型數(shù)據(jù)轉(zhuǎn)換為離散型數(shù)據(jù)一般包含兩個(gè)子任務(wù):判斷需要多少個(gè)離散型數(shù)據(jù);如何把連續(xù)型數(shù)據(jù)映射到離散型數(shù)據(jù)上。第一步,先對(duì)連續(xù)型數(shù)據(jù)進(jìn)行排序,然后指定n-1個(gè)點(diǎn)把數(shù)據(jù)分為n個(gè)區(qū)間;第二步,把落在同一區(qū)間內(nèi)的所有連續(xù)型數(shù)據(jù)都映射到相同的離散型數(shù)據(jù)上。因此,離散化問題就變?yōu)槿绾蝿澐謪^(qū)間的問題。

分箱方法也可用于離散化。所謂分箱,就是把數(shù)據(jù)按照特定的規(guī)則進(jìn)行分組,實(shí)現(xiàn)數(shù)據(jù)的離散化,增強(qiáng)數(shù)據(jù)穩(wěn)定性,減少過擬合風(fēng)險(xiǎn)。

6.4數(shù)據(jù)標(biāo)準(zhǔn)化

在進(jìn)行數(shù)據(jù)分析之前,通常要收集大量不同的相關(guān)指標(biāo),每個(gè)指標(biāo)的性質(zhì)、量綱、數(shù)量級(jí)、可用性等特征均可能存在差異,導(dǎo)致我們無法直接用其分析研究對(duì)象的特征和規(guī)律。當(dāng)各指標(biāo)間的水平相差很大時(shí),如果直接用指標(biāo)原始值進(jìn)行分析,數(shù)值較高的指標(biāo)在綜合分析中的作用就會(huì)被放大,相對(duì)地,會(huì)削弱數(shù)值水平較低的指標(biāo)的作用。

比如,在評(píng)價(jià)不同時(shí)期的物價(jià)指數(shù)時(shí),較低價(jià)格的蔬菜和較高價(jià)格的家電的價(jià)格漲幅都可以被納入其中,但是由于它們的價(jià)格水平差異較大,如果直接用其價(jià)格做分析,會(huì)使價(jià)格水平較高的家電在綜合指數(shù)中的作用被放大。因此,為了保證結(jié)果的可靠性,需要對(duì)原始指標(biāo)數(shù)據(jù)進(jìn)行變換處理,使不同的特征具有相同的尺度。

數(shù)據(jù)標(biāo)準(zhǔn)化是指將數(shù)據(jù)按比例縮放,使之落入一個(gè)小的特定區(qū)間。在某些比較和評(píng)價(jià)的指標(biāo)處理中經(jīng)常會(huì)用到,去除數(shù)據(jù)的單位限制,將其轉(zhuǎn)化為無量綱的純數(shù)值,便于不同單位或量級(jí)的指標(biāo)能夠進(jìn)行比較和加權(quán)。

6.4.1數(shù)據(jù)標(biāo)準(zhǔn)化的概念在多指標(biāo)評(píng)價(jià)體系中,由于各評(píng)價(jià)指標(biāo)的性質(zhì)不同,通常具有不同的量綱和數(shù)量級(jí)。當(dāng)各指標(biāo)間的水平相差很大時(shí),如果直接用原始指標(biāo)值進(jìn)行分析,就會(huì)突出數(shù)值較高的指標(biāo)在綜合分析中的作用,相對(duì)削弱數(shù)值水平較低指標(biāo)的作用。因此,為了保證結(jié)果的可靠性,需要對(duì)原始指標(biāo)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理。在不同的問題中,標(biāo)準(zhǔn)化的意義不同:在回歸預(yù)測(cè)中,標(biāo)準(zhǔn)化是為了讓特征值有均等的權(quán)重;在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過程中,通過將數(shù)據(jù)標(biāo)準(zhǔn)化,能夠加速權(quán)重參數(shù)的收斂;主成分分析中,需要對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理。默認(rèn)指標(biāo)間權(quán)重相等,不考慮指標(biāo)間差異和相互影響。

6.4.2數(shù)據(jù)標(biāo)準(zhǔn)化的方法目前數(shù)據(jù)標(biāo)準(zhǔn)化方法有很多,大概可以分為:直線型方法(如極值法、標(biāo)準(zhǔn)差法)、折線型方法(如三折線法)、曲線型方法(如半正態(tài)性分布)。不同的標(biāo)準(zhǔn)化方法,對(duì)系統(tǒng)的評(píng)價(jià)結(jié)果會(huì)產(chǎn)生不同的影響,而且在數(shù)據(jù)標(biāo)準(zhǔn)化方法的選擇上,還沒有通用的法則可以遵循。常見的方法有:min-max標(biāo)準(zhǔn)化(min-maxnormalization)、log函數(shù)轉(zhuǎn)換、atan函數(shù)轉(zhuǎn)換、z-score標(biāo)準(zhǔn)化(zero-menanormalization,此方法比較常用)、模糊量化法。經(jīng)過標(biāo)準(zhǔn)化處理,原始數(shù)據(jù)均轉(zhuǎn)換為無量綱化指標(biāo)測(cè)評(píng)值,即各指標(biāo)值都處于同一個(gè)數(shù)量級(jí)別上,可以進(jìn)行綜合測(cè)評(píng)分析。

6.4.2數(shù)據(jù)標(biāo)準(zhǔn)化的方法

6.4.2數(shù)據(jù)標(biāo)準(zhǔn)化的方法

6.4.2數(shù)據(jù)標(biāo)準(zhǔn)化的方法

6.4.2數(shù)據(jù)標(biāo)準(zhǔn)化的方法

6.4.2數(shù)據(jù)標(biāo)準(zhǔn)化的方法

6.5本章小結(jié)我們簡(jiǎn)單回顧一下本章內(nèi)容。

在6.1節(jié)中,我們首先簡(jiǎn)單介紹了爬蟲相關(guān)的基礎(chǔ)知識(shí),如HTTP基本原理、Xpath和正則表達(dá)式等,學(xué)習(xí)這些工具,可有效提高所爬取數(shù)據(jù)的效率和質(zhì)量,其后,我們主要介紹了Scrapy爬蟲框架的基本原理和工作流程,并提供了爬取鏈家網(wǎng)址北京二手房信息的實(shí)例。

在6.2—6.4節(jié)中,我們依次介紹了常用的數(shù)據(jù)清洗、數(shù)據(jù)規(guī)約以及數(shù)據(jù)標(biāo)準(zhǔn)化等相關(guān)知識(shí),在大數(shù)據(jù)分析時(shí),原始數(shù)據(jù)難免存在重復(fù)、缺失以及相互沖突等現(xiàn)象,通過數(shù)據(jù)清洗可有效提高數(shù)據(jù)可用性,其后根據(jù)數(shù)據(jù)分析的目標(biāo),選擇合適的數(shù)據(jù)規(guī)約和數(shù)據(jù)標(biāo)準(zhǔn)化方法,從而提高后續(xù)數(shù)據(jù)分析的準(zhǔn)確性和效率。

6.6習(xí)題1.常見的HTTP請(qǐng)求方法有哪些?2.Scprapy框架主要包含哪些組件,其作用分別是什么?3.數(shù)據(jù)清洗中,常見的缺失值填充方法有哪些?4.數(shù)據(jù)標(biāo)準(zhǔn)化的作用是什么?

參考答案1.常見的HTTP請(qǐng)求方法有GET方法和POST方法,GET方法用于請(qǐng)求指定的頁面信息,并返回實(shí)體主體。POST方法用于向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求,數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立或已有資源的修改。2.Scrapy框架主要包含Engine(引擎)、Scheduler(調(diào)度器)、Downloader(下載器)、Spider(爬蟲)、ItemPipeline(管道)、DownloaderMiddlewares(下載中間件)、SpiderMiddlewares(Spider中間件)這幾個(gè)組件。其中,引擎用來處理整個(gè)系統(tǒng)的數(shù)據(jù)流,觸發(fā)事務(wù)。調(diào)度器負(fù)責(zé)接收引擎發(fā)送來的Request請(qǐng)求,并按照一定的方式進(jìn)行整理排列。下載區(qū)負(fù)責(zé)下載引擎發(fā)送的所有Request請(qǐng)求,并將其獲取到的Response交還給引擎。爬蟲負(fù)責(zé)處理所有的Response,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將其需要跟進(jìn)的URL提交給引擎。管道負(fù)責(zé)處理爬蟲中獲取到的Item,并進(jìn)行后期處理。下載中間件是一個(gè)可以自定義擴(kuò)展下載功能的組件,而Spider中間件是可以自定擴(kuò)展和操作引擎與爬蟲之間通信的功能組件。參考答案3.常見的缺失值填充方法有填充固定值、填充均值、填充中位數(shù)、填充眾數(shù)、填充上下條的數(shù)據(jù)等。4.在多指標(biāo)評(píng)價(jià)體系中,由于各評(píng)價(jià)指標(biāo)的性質(zhì)不同,通常具有不同的量綱和數(shù)量級(jí)。當(dāng)各指標(biāo)間的水平相差很大時(shí),如果直接用原始指標(biāo)值進(jìn)行分析,就會(huì)突出數(shù)值較高的指標(biāo)在綜合分析中的作用,相對(duì)削弱數(shù)值水平較低指標(biāo)的作用。因此,為了保證結(jié)果的可靠性,需要對(duì)原始指標(biāo)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理。數(shù)據(jù)的標(biāo)準(zhǔn)化(normalization)是將數(shù)據(jù)按比例縮放,使之落入一個(gè)小的特定區(qū)間。在某些比較和評(píng)價(jià)的指標(biāo)處理中經(jīng)常會(huì)用到,去除數(shù)據(jù)的單位限制,將其轉(zhuǎn)化為無量綱的純數(shù)值,便于不同單位或量級(jí)的指標(biāo)能夠進(jìn)行比較和加權(quán)。第7章大數(shù)據(jù)分析算法本章目標(biāo)本章主要內(nèi)容是SparkMLlib中的經(jīng)典聚類算法和分類算法,通過學(xué)習(xí)本章,應(yīng)該達(dá)到以下目標(biāo):掌握幾種經(jīng)典的大數(shù)據(jù)聚類和分類算法的基本原理、詳細(xì)步驟、應(yīng)用實(shí)例和Spark實(shí)現(xiàn)。通過大數(shù)據(jù)聚類算法和分類算法的SparkMLlib實(shí)現(xiàn)進(jìn)行實(shí)例分析,掌握大數(shù)據(jù)聚類和分類分析程序的設(shè)計(jì)思路和實(shí)現(xiàn)方法。本章內(nèi)容7.1聚類算法7.1.1經(jīng)典聚類算法聚類算法的基本原理K-Means算法二分K-Means算法高斯混合模型冪迭代聚類7.1.2大數(shù)據(jù)聚類算法的應(yīng)用7.2分類算法7.2.1經(jīng)典分類算法分類算法的基本原理決策樹算法邏輯回歸算法支持向量機(jī)算法隨機(jī)森林算法樸素貝葉斯算法7.2.2大數(shù)據(jù)分類算法的應(yīng)用7.1聚類算法7.1.1經(jīng)典聚類算法聚類算法的基本原理目的:通過分析將沒有標(biāo)簽的、事先不知道會(huì)分為幾類的數(shù)據(jù)劃分成若干簇,并保證每一簇中的數(shù)據(jù)盡量接近,而不同簇的數(shù)據(jù)距離盡量遠(yuǎn)?;舅悸罚豪脭?shù)據(jù)集中數(shù)據(jù)特征值之間的距離遠(yuǎn)近來判斷數(shù)據(jù)是否被劃分到同一類別。聚類算法的基本原理聚類算法基于劃分的聚類算法基于層次的聚類算法基于密度的聚類算法基于網(wǎng)格的聚類算法K-Means算法K-Means算法是一種迭代求解的基于劃分的聚類算法。基本思路:首先初始化K個(gè)劃分,然后將樣本從一個(gè)劃分轉(zhuǎn)移到另一個(gè)劃分以優(yōu)化聚類質(zhì)量,迭代此過程直至最大迭代次數(shù)。K-Means算法優(yōu)點(diǎn):易于理解算法復(fù)雜度低聚類效果雖然是局部最優(yōu)但足夠解決大部分問題對(duì)較大規(guī)模的數(shù)據(jù)集可以保證較好的伸縮性,即數(shù)據(jù)對(duì)象從幾百到幾百萬都能保持聚類結(jié)果準(zhǔn)確度一致。K-Means算法缺點(diǎn):k值需要人為設(shè)定,不同的k值結(jié)果也不同。初始劃分的中心也會(huì)影響聚類結(jié)果,不同的選取方式得到的結(jié)果不同。

K-Means算法對(duì)孤立點(diǎn)和噪聲數(shù)據(jù)比較敏感,異常值會(huì)導(dǎo)致均值偏離嚴(yán)重,陷入局部最小值。離散程度高的分類、非凸分類、類別不平衡的分類就不適合使用K-Means算法。K-Means算法的基本步驟開始根據(jù)給定的k值,選取k個(gè)初始劃分中心計(jì)算數(shù)據(jù)集中每個(gè)樣本點(diǎn)到k個(gè)劃分中心的距離,將樣本點(diǎn)劃分到距離最近的劃分中心的類中針對(duì)每個(gè)類別計(jì)算樣本點(diǎn)的平均值,得到新的劃分中心是否達(dá)到最大迭代次數(shù)或劃分中心變化是否小于設(shè)定的閾值結(jié)束否是K-Means算法的應(yīng)用實(shí)例fromnumpyimportarray

frompysparkimportSparkContextfrompyspark.mllib.clusteringimportKMeans,KMeansModel

#appName:在集群webUI上顯示的作業(yè)名稱。#master:要連接到的集群URL(例如

mesos:#host:port,spark:#host:port,#local[4])。sc=SparkContext(appName="KMeans_pyspark",master='local')第1步:引入必要的類。使用pyspark時(shí)需要引入SparkContext類,SparkContext是spark功能的入口點(diǎn),在引入類后需要定義sc=SparkContext(appName="KMeans_pyspark",master='local'),否則運(yùn)行程序時(shí)可能會(huì)報(bào)錯(cuò)。K-Means算法需要從pyspark.mllib.clustering中引入KMeans類和KMeansModel類。K-Means算法的應(yīng)用實(shí)例nodes=array([0.0,0.0,1.0,1.0,9.0,8.0,8.0,9.0]).reshape(4,2)print(nodes)第2步:創(chuàng)建數(shù)據(jù)集。這里創(chuàng)建一個(gè)包含4個(gè)數(shù)據(jù)點(diǎn)、每個(gè)數(shù)據(jù)點(diǎn)包括2個(gè)屬性的數(shù)據(jù)集。[[0.0.][1.1.][9.8.][8.9.]]結(jié)果如下:K-Means算法的應(yīng)用實(shí)例model=KMeans.train(sc.parallelize(nodes),2,maxIterations=10,initializationMode="random")第3步:根據(jù)上面創(chuàng)建的數(shù)據(jù)集訓(xùn)練K-Means聚類模型。其中sc.parallelize()可以將數(shù)據(jù)集轉(zhuǎn)化為MLlib需要的RDD格式,該方法有2個(gè)參數(shù),第1個(gè)參數(shù)是待轉(zhuǎn)化的數(shù)據(jù)集,第2個(gè)參數(shù)是數(shù)據(jù)集的切片數(shù)(默認(rèn)值:None)。創(chuàng)建K-Means模型需要用到KMeans.train()方法。下面的例子中runs、seed、initializationSteps、epsilon和initialModel參數(shù)沒有指定,使用默認(rèn)值。K-Means算法的應(yīng)用實(shí)例forclusterCenterinmodel.clusterCenters:print(clusterCenter)fornodeinnodes:print(str(node)+"belongstocluster"+str(model.clusterCenters[model.predict(node)]))第4步:根據(jù)KMeansModel自帶的屬性及方法獲得聚類中心和樣本點(diǎn)對(duì)應(yīng)的聚類值。[8.58.5][0.50.5][0.0.]belongstocluster[0.50.5][1.1.]belongstocluster[0.50.5][9.8.]belongstocluster[8.58.5][8.9.]belongstocluster[8.58.5]結(jié)果如下:K-Means算法的spark實(shí)現(xiàn)K-Means算法的實(shí)現(xiàn)由方法runAlgorithmWithWeight()完成。該方法進(jìn)行訓(xùn)練的整體思路是數(shù)據(jù)分區(qū),將聚類中心點(diǎn)信息廣播至各個(gè)分區(qū)計(jì)算每個(gè)中心點(diǎn)的累計(jì)距離距離(損失),累計(jì)坐標(biāo)值和計(jì)數(shù);以聚類的索引ID作為key進(jìn)行reduce,計(jì)算整個(gè)數(shù)據(jù)集的每個(gè)中心點(diǎn)的累計(jì)距離和成本,累計(jì)坐標(biāo)值和計(jì)數(shù)。privatedefrunAlgorithmWithWeight(data:RDD[VectorWithNorm],

instr:Option[Instrumentation]):KMeansModel={

valsc=data.sparkContext

valinitStartTime=System.nanoTime()

valdistanceMeasureInstance=DistanceMeasure.decodeFromString(this.distanceMeasure)K-Means算法的spark實(shí)現(xiàn)

#初始化中心,支持random(隨機(jī)選擇)或K-Means||(選擇最優(yōu)樣本點(diǎn))

valcenters=initialModelmatch{caseSome(kMeansCenters)=>

kMeansCenters.clusterCenters.map(newVectorWithNorm(_))caseNone=>if(initializationMode==KMeans.RANDOM){

initRandom(data)}else{

initKMeansParallel(data,distanceMeasureInstance)}}valnumFeatures=centers.head.vector.sizevalinitTimeInSeconds=(System.nanoTime()-initStartTime)/1e9

logInfo(f"Initializationwith$initializationModetook$initTimeInSeconds%.3fseconds.")K-Means算法的spark實(shí)現(xiàn)varconverged=falsevarcost=0.0variteration=0valiterationStartTime=System.nanoTime()

instr.foreach(_.logNumFeatures(numFeatures))valshouldDistributed=centers.length*centers.length*numFeatures.toLong>1000000LK-Means算法的spark實(shí)現(xiàn)

#執(zhí)行Lloyd算法的迭代,直到收斂

while(iteration<maxIterations&&!converged){valbcCenters=sc.broadcast(centers)valstats=if(shouldDistributed){

distanceMeasureIputeStatisticsDistributedly(sc,bcCenters)}else{

distanceMeasureIputeStatistics(centers)}valbcStats=sc.broadcast(stats)valcostAccum=sc.doubleAccumulatorK-Means算法的spark實(shí)現(xiàn)

#找到新的中心

valcollected=data.mapPartitions{points=>valcenters=bcCenters.valuevalstats=bcStats.valuevaldims=centers.head.vector.sizevalsums=Array.fill(centers.length)(Vectors.zeros(dims))#使用clusterWeightSum計(jì)算聚類中心

#clustercenter=sample1*weight1/clusterWeightSum+sample2*weight2/clusterWeightSum+...K-Means算法的spark實(shí)現(xiàn)

#創(chuàng)建clusterWeightSum數(shù)組,長度為中心個(gè)數(shù)

valclusterWeightSum=Array.ofDim[Double](centers.length)

points.foreach{point=> #針對(duì)每一個(gè)樣本點(diǎn)

val(bestCenter,cost)=distanceMeasureInstance.findClosest(centers,stats,point) #計(jì)算樣本點(diǎn)point屬于哪個(gè)中心點(diǎn)和在該點(diǎn)下的cost值

costAccum.add(cost*point.weight)

distanceMeasureInstance.updateClusterSum(point,sums(bestCenter))

clusterWeightSum(bestCenter)+=point.weight}K-Means算法的spark實(shí)現(xiàn)

Iterator.tabulate(centers.length)(j=>(j,(sums(j),clusterWeightSum(j)))).filter(_._2._2>0)}.reduceByKey{(sumweight1,sumweight2)=>

axpy(1.0,sumweight2._1,sumweight1._1)(sumweight1._1,sumweight1._2+sumweight2._2)}.collectAsMap()if(iteration==0){

instr.foreach(_.logNumExamples(costAccum.count))

instr.foreach(_.logSumOfWeights(collected.values.map(_._2).sum))}

bcCenters.destroy()

bcStats.destroy()K-Means算法的spark實(shí)現(xiàn)

#更新聚類中心和成本

converged=true

collected.foreach{case(j,(sum,weightSum))=>valnewCenter=distanceMeasureInstance.centroid(sum,weightSum)if(converged&&!distanceMeasureInstance.isCenterConverged(centers(j),newCenter,epsilon)){converged=false}centers(j)=newCenter}cost=costAccum.value

instr.foreach(_.logNamedValue(s"Cost@iter=$iteration",s"$cost"))iteration+=1}K-Means算法的spark實(shí)現(xiàn)

valiterationTimeInSeconds=(System.nanoTime()-iterationStartTime)/1e9

logInfo(f"Iterationstook$iterationTimeInSeconds%.3fseconds.")if(iteration==maxIterations){

logInfo(s"KMeansreachedthemaxnumberofiterations:$maxIterations.")}else{

logInfo(s"KMeansconvergedin$iterationiterations.")}

logInfo(s"Thecostis$cost.")newKMeansModel(centers.map(_.vector),distanceMeasure,cost,iteration)}二分K-Means算法

二分K-Means算法的基本步驟開始將所有樣本點(diǎn)劃分到一個(gè)聚類簇中,再將這個(gè)簇一分為二選擇劃分后能最大程度降低SSE的簇作為可分解的簇使用K-Means算法將可分解的簇分解成兩簇是否達(dá)到最大迭代次數(shù)或劃分中心變化是否小于設(shè)定的閾值結(jié)束否是二分K-Means算法的應(yīng)用實(shí)例fromnumpyimportarray

frompysparkimportSparkContextfrompyspark.mllib.clusteringimportBisectingKMeans,BisectingKMeansModel#appName:在集群webUI上顯示的作業(yè)名稱。#master:要連接到的集群URL(例如

mesos:#host:port,spark:#host:port,#local[4])。sc=SparkContext(appName="BisectingKMeans_pyspark",master='local')第1步:引入必要的類。使用pyspark時(shí)需要引入SparkContext類,SparkContext是spark功能的入口點(diǎn),在引入類后需要定義sc=SparkContext(appName="KMeans_pyspark",master='local'),否則運(yùn)行程序時(shí)可能會(huì)報(bào)錯(cuò)。二分K-Means算法需要從pyspark.mllib.clustering中引入BisectingKMeans類和BisectingKMeansModel類。二分K-Means算法的應(yīng)用實(shí)例nodes=array([0.0,0.0,1.0,1.0,9.0,8.0,8.0,9.0,5.0,4.0,4.0,5.0,3.0,4.0,4.0,2.0]).reshape(8,2)print(nodes)第2步:創(chuàng)建數(shù)據(jù)集。這里創(chuàng)建一個(gè)包含8個(gè)數(shù)據(jù)點(diǎn)、每個(gè)數(shù)據(jù)點(diǎn)包括2個(gè)屬性的數(shù)據(jù)集。[[0.0.][1.1.][9.8.][8.9.][5.4.][4.5.][3.4.][4.2.]]結(jié)果如下:二分K-Means算法的應(yīng)用實(shí)例bskm=BisectingKMeans()model=bskm.train(sc.parallelize(nodes,2),k=4)第3步:根據(jù)上面創(chuàng)建的數(shù)據(jù)集創(chuàng)建二分K-Means聚類模型。創(chuàng)建二分K-Means模型需要用到BisectingKMeans.train()方法。下面的例子中maxIterations、Mindivisbleclustersize和seed參數(shù)沒有指定,使用默認(rèn)值。二分K-Means算法的應(yīng)用實(shí)例forclusterCenterinmodel.clusterCenters:print(clusterCenter)第4步:根據(jù)BisectingKMeansModel自帶的屬性及方法獲得聚類中心和樣本點(diǎn)對(duì)應(yīng)的聚類值。[0.50.5][3.53.][4.54.5][8.58.5]結(jié)果如下:fornodeinnodes:print(str(node)+"belongstocluster"+str(model.clusterCenters[model.predict(node)]))[0.0.]belongstocluster[0.50.5][1.1.]belongstocluster[0.50.5][9.8.]belongstocluster[8.58.5][8.9.]belongstocluster[8.58.5][5.4.]belongstocluster[4.54.5][4.5.]belongstocluster[4.54.5][3.4.]belongstocluster[3.53.][4.2.]belongstocluster[3.53.]結(jié)果如下:二分K-Means算法的spark實(shí)現(xiàn)二分K-means算法在MLlib中也是通過API調(diào)用scala版本的BisectingKMeans類實(shí)現(xiàn)的。該算法從一個(gè)包含所有點(diǎn)的集群開始。它迭代地在底層找到可劃分的簇,并使用K-means將每個(gè)簇平分,直到總共有k個(gè)簇或沒有簇可劃分為止。將同一層的簇的平分步驟組合在一起,以增加并行性。如果在底層將所有可分簇平分將導(dǎo)致更多的k個(gè)簇,更大的簇獲得更高的優(yōu)先級(jí)。deftrain(self,rdd,k=4,maxIterations=20,minDivisibleClusterSize=1.0,seed=-1888008604):#調(diào)用trainBisectingKMeansAPI

java_model=callMLlibFunc("trainBisectingKMeans",rdd.map(_convert_to_vector),k,maxIterations,minDivisibleClusterSize,seed)returnBisectingKMeansModel(java_model)二分K-Means算法的spark實(shí)現(xiàn)#trainBisectingKMeansAPIdeftrainBisectingKMeans(data:JavaRDD[Vector],k:Int,

maxIterations:Int,

minDivisibleClusterSize:Double,seed:java.lang.Long):BisectingKMeansModel={valkmeans=newBisectingKMeans().setK(k).setMaxIterations(maxIterations).setMinDivisibleClusterSize(minDivisibleClusterSize)if(seed!=null)kmeans.setSeed(seed)

kmeans.run(data)#調(diào)用BisectingKMeans類中的run()方法}二分K-Means算法的spark實(shí)現(xiàn)defrun(input:RDD[Vector]):BisectingKMeansModel={#將數(shù)據(jù)集由RDD[Vector]轉(zhuǎn)化為RDD[(Vector,Double)]格式valinstances=input.map(point=>(point,1.0))#判斷RDD當(dāng)前是否設(shè)置存儲(chǔ)級(jí)別valhandlePersistence=input.getStorageLevel==StorageLevel.NONE#調(diào)用runWithWeight()方法實(shí)現(xiàn)算法

runWithWeight(instances,handlePersistence,None)}Scala版本的BisectingKMeans類按照給定的參數(shù)運(yùn)行run方法訓(xùn)練模型。具體源碼如下:二分K-Means算法的spark實(shí)現(xiàn)#runWithWeight()方法具體實(shí)現(xiàn)二分K-means算法private[spark]defrunWithWeight(instances:RDD[(Vector,Double)],

handlePersistence:Boolean,

instr:Option[Instrumentation]):BisectingKMeansModel={vald=instances.map(_._1.size).first

logInfo(s"Featuredimension:$d.")valdMeasure=DistanceMeasure.decodeFromString(this.distanceMeasure)valnorms=instances.map(d=>Vectors.norm(d._1,2.0))#計(jì)算數(shù)據(jù)的二范數(shù)#將數(shù)據(jù)轉(zhuǎn)化成VectorWithNorm類

valvectors=instances.zip(norms).map{case((x,weight),norm)=>newVectorWithNorm(x,norm,weight)}if(handlePersistence){

vectors.persist(StorageLevel.MEMORY_AND_DISK)}else{

二分K-Means算法的spark實(shí)現(xiàn)

#計(jì)算和緩存用于快速距離計(jì)算的向量范數(shù)。

norms.persist(StorageLevel.MEMORY_AND_DISK)}varassignments=vectors.map(v=>(ROOT_INDEX,v))varactiveClusters=summarize(d,assignments,dMeasure)

instr.foreach(_.logNumExamples(activeClusters.values.map(_.size).sum))instr.foreach(_.logSumOfWeights(activeClusters.values.map(_.weightSum).sum))valrootSummary=activeClusters(ROOT_INDEX)valn=rootSummary.size

logInfo(s"Numberofpoints:$n.")

logInfo(s"Initialcost:${rootSummary.cost}.")valminSize=if(minDivisibleClusterSize>=1.0){

math.ceil(minDivisibleClusterSize).toLong}else{

math.ceil(minDivisibleClusterSize*n).toLong}二分K-Means算法的spark實(shí)現(xiàn)

logInfo(s"Theminimumnumberofpointsofadivisibleclusteris$minSize.")varinactiveClusters=mutable.Seq.empty[(Long,ClusterSummary)]valrandom=newRandom(seed)varnumLeafClustersNeeded=k-1varlevel=1varpreIndices:RDD[Long]=nullvarindices:RDD[Long]=nullwhile(activeClusters.nonEmpty&&numLeafClustersNeeded>0&&level<LEVEL_LIMIT){

#可分集群具有足夠大和非平凡成本。

vardivisibleClusters=activeClusters.filter{case(_,summary)=>(summary.size>=minSize)&&(summary.cost>MLUtils.EPSILON*summary.size)}

#如果我們不需要所有可分集群,選擇較大的集群。

if(divisibleClusters.size>numLeafClustersNeeded){

divisibleClusters=divisibleClusters.toSeq.sortBy{case(_,summary)=>-summary.size}.take(numLeafClustersNeeded).toMap}二分K-Means算法的spark實(shí)現(xiàn)if(divisibleClusters.nonEmpty){valdivisibleIndices=divisibleClusters.keys.toSet

logInfo(s"Dividing${divisibleIndices.size}clustersonlevel$level.")varnewClusterCenters=divisibleClusters.flatMap{case(index,summary)=>val(left,right)=splitCenter(summary.center,random,dMeasure)Iterator((leftChildIndex(index),left),(rightChildIndex(index),right))}.map(identity)#解決產(chǎn)生不可序列化映射的Scalabug(SI-7005)varnewClusters:Map[Long,ClusterSummary]=nullvarnewAssignments:RDD[(Long,VectorWithNorm)]=nullfor(iter<-0untilmaxIterations){

newAssignments=updateAssignments(assignments,divisibleIndices,newClusterCenters,dMeasure).filter{case(index,_)=>

divisibleIndices.contains(parentIndex(index))}

newClusters=summarize(d,newAssignments,dMeasure)

newClusterCenters=newClusters.mapValues(_.center).map(identity).toMap}二分K-Means算法的spark實(shí)現(xiàn)if(preIndices!=null){

preIndices.unpersist()}

preIndices=indicesindices=updateAssignments(assignments,divisibleIndices,newClusterCenters,dMeasure).keys.persist(StorageLevel.MEMORY_AND_DISK)assignments=indices.zip(vectors)

inactiveClusters++=activeClusters

activeClusters=newClusters

numLeafClustersNeeded-=divisibleClusters.size}else{

logInfo(s"Noneactiveanddivisibleclustersleftonlevel$level.Stopiterations.")

inactiveClusters++=activeClusters

activeClusters=Map.empty}level+=1}二分K-Means算法的spark實(shí)現(xiàn)if(preIndices!=null){preIndices.unpersist()}if(indices!=null){indices.unpersist()}if(handlePersistence){vectors.unpersist()}else{norms.unpersist()}valclusters=activeClusters++inactiveClustersvalroot=buildTree(clusters,dMeasure)valtotalCost=root.leafNodes.map(_.cost).sumnewBisectingKMeansModel(root,this.distanceMeasure,totalCost)}高斯混合模型高斯混合模型(GaussianMixtureModel,GMM)與目前大多數(shù)聚類算法不同,其他聚類算法多以相似度為劃分依據(jù),而GMM則將概率作為判斷依據(jù)。它假設(shè)所有樣本都是由某個(gè)給定參數(shù)的多元高斯分布生成,通過樣本點(diǎn)屬于某一類別的概率大小來判斷該樣本點(diǎn)所屬的聚類?;舅悸罚航o定聚類的簇個(gè)數(shù)k,對(duì)給定數(shù)據(jù)集,使用極大似然估計(jì)法,推導(dǎo)出每一個(gè)混合成分的均值向量μ、協(xié)方差矩陣Σ和權(quán)重w,得到的多元高斯分布對(duì)應(yīng)聚類的一個(gè)簇。高斯混合模型的基本步驟開始初始化K個(gè)多元高斯分布及其權(quán)重根據(jù)貝葉斯定理估計(jì)每個(gè)樣本由每個(gè)成分生成的后驗(yàn)概率根據(jù)均值、協(xié)方差及上一步中得到的后驗(yàn)概率,更新均值向量、協(xié)方差矩陣和權(quán)重是否達(dá)到最大迭代次數(shù)或似然函數(shù)的增加值是否小于收斂閾值結(jié)束否是高斯混合模型的應(yīng)用實(shí)例fromnumpyimportarrayfrompysparkimportSparkContext#frompyspark.mllib.linalgimportVectors,DenseMatrixfrompyspark.mllib.clusteringimportGaussianMixture,GaussianMixtureModelsc=SparkContext(appName="GMM_pyspark",master='local')第1步:引入必要的類。使用pyspark時(shí)需要引入SparkContext類,SparkContext是spark功能的入口點(diǎn),在引入類后需要定義sc=SparkContext(appName="KMeans_pyspark",master='local'),否則運(yùn)行程序時(shí)可能會(huì)報(bào)錯(cuò)。GMM算法需要從pyspark.mllib.clustering中引入GaussianMixture類和GaussianMixtureModel類,從pyspark.mllib.linalg中引入Vectors類和DenseMatrix類。高斯混合模型的應(yīng)用實(shí)例nodes=array([-0.1,-0.05,-0.01,-0.1,0.9,0.8,\0.75,0.935,-0.83,-0.68,-0.91,-0.76])\.reshape(6,2)第2步:創(chuàng)建數(shù)據(jù)集。這里創(chuàng)建一個(gè)包含6個(gè)數(shù)據(jù)點(diǎn)、每個(gè)數(shù)據(jù)點(diǎn)包括2個(gè)屬性的數(shù)據(jù)集。[[-0.1-0.05][-0.01-0.1][0.90.8][0.750.935][-0.83-0.68][-0.91-0.76]]結(jié)果如下:高斯混合模型的應(yīng)用實(shí)例clusterdata=sc.parallelize(nodes,2)model=GaussianMixture.train(clusterdata,3,convergenceTol=0.0001,maxIterations=50,seed=10)第3步:根據(jù)上面創(chuàng)建的數(shù)據(jù)集訓(xùn)練GMM聚類模型。訓(xùn)練GMM模型需要用到GaussianMixture.train()方法。下面的例子中initialModel參數(shù)沒有指定,使用默認(rèn)值。高斯混合模型的應(yīng)用實(shí)例fornodeinnodes:print(str(node)+"belongstocluster:"+str(model.predict(node)))第4步:根據(jù)GaussianMixtureModel自帶的屬性及方法獲得樣本點(diǎn)對(duì)應(yīng)的聚類值。[-0.1-0.05]belongstocluster:2[-0.01-0.1]belongstocluster:2[0.90.8]belongstocluster:0[0.750.935]belongstocluster:0[-0.83-0.68]belongstocluster:1[-0.91-0.76]belongstocluster:1結(jié)果如下:softPredicted=model.predictSoft([-0.1,-0.05])abs(softPredicted[0]-1.0)<0.03False結(jié)果如下:高斯混合模型的spark實(shí)現(xiàn)在SparkMLlib中,GMM主要通過GaussianMixtur

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論