大數(shù)據(jù)挖掘聚類算法課程設計報告材料_第1頁
大數(shù)據(jù)挖掘聚類算法課程設計報告材料_第2頁
大數(shù)據(jù)挖掘聚類算法課程設計報告材料_第3頁
大數(shù)據(jù)挖掘聚類算法課程設計報告材料_第4頁
免費預覽已結(jié)束,剩余14頁可下載查看

下載本文檔

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

文檔簡介

1、實用標準文案數(shù)據(jù)挖掘聚類問題 (Plants Data Set)實驗報告1. 數(shù)據(jù)源描述1.1 數(shù)據(jù)特征本實驗用到的是關于植物信息的數(shù)據(jù)集,其中包含了每一種植物(種類和科屬 )以及它們生長的地區(qū)。數(shù)據(jù)集中總共有68 個地區(qū),主要分布在美國和加拿大。一條數(shù)據(jù)(對應于文件中的一行)包含一種植物 (或者某一科屬 )及其在上述68 個地區(qū)中的分布情況??梢赃@樣理解,該數(shù)據(jù)集中每一條數(shù)據(jù)包含兩部分內(nèi)容,如下圖所示。植物名稱 ( 科屬 +名稱 )分布區(qū)域圖 1 數(shù)據(jù)格式例如一條數(shù)據(jù) :abroniafragrans,az,co,ks,mt,ne,nm,nd,ok,sd,tx,ut,wa,wy。其中abro

2、niafragrans是植物名稱 (abronia是科屬, fragrans是名稱 ) ,從 az 一直到 wy是該植物的分布區(qū)域,采用縮寫形式表示,如az 代表的是美國Arizona州。植物名稱和分布地區(qū)用逗號隔開,各地區(qū)之間也用逗號隔開。1.2 任務要求聚類。采用聚類算法根據(jù)某種特征對所給數(shù)據(jù)集進行聚類分析,對于聚類形成的簇要使得簇內(nèi)數(shù)據(jù)對象之間的差異盡可能小,簇之間的差距盡可能大。2. 數(shù)據(jù)預處理2.1 數(shù)據(jù)清理所給數(shù)據(jù)集中包含一些對聚類過程無用的冗余數(shù)據(jù)。數(shù)據(jù)集中全部數(shù)據(jù)的組織結(jié)構(gòu)是:先給出某一科屬的植物及其所有分布地區(qū),然后給出該科屬下的具體植物及其分布地區(qū)。例如:文檔大全實用標準文

3、案abelmoschus,ct,dc,fl,hi,il,ky,la,md,mi,ms,nc,sc,va,pr,viabelmoschus esculentus,ct,dc,fl,il,ky,la,md,mi,ms,nc,sc,va,pr,viabelmoschus moschatus,hi,pr上述數(shù)據(jù)中第行給出了所有屬于abelmoschus這一科屬的植物的分布地區(qū),接下來的兩行分別列出了屬于abelmoschus科屬的兩種具體植物及其分布地區(qū)。從中可以看出后兩行給出的所有地區(qū)的并集正是第一行給出的地區(qū)集合。在聚類過程中第行數(shù)據(jù)是無用的,因此要對其進行清理。2.2 數(shù)據(jù)變換本實驗是依據(jù)植物的

4、分布區(qū)域進行聚類,所給數(shù)據(jù)集中的分布區(qū)域是字符串形式,不適合進行聚類,因此將其變換成適合聚類的數(shù)值形式。具體思想如下:數(shù)據(jù)集中總共包含68 個區(qū)域,每一種植物的分布區(qū)域是這68 個區(qū)域中的一部分。本實驗中將 68 個區(qū)域看成是數(shù)據(jù)對象的68 個屬性,這 68 個屬性是二元類型的變量,其值只能去0 或者 1。步驟如下:1.把 68 個區(qū)域按一定順序存放在字符串數(shù)組(記為 str) 中(順序可以自己定,確定后不能改變 )。2.為數(shù)據(jù)集中的每個數(shù)據(jù)對象設置一個長度為68 字符串數(shù)組,初始元素值全為 0。將數(shù)據(jù)對象的分布區(qū)域逐個與 str 中的所有元素比較。如果存在于str中下標 i 的位置,就將該數(shù)

5、據(jù)對象的字符串數(shù)組的第i 位置為 1。例如,一個數(shù)據(jù)對象為:abies fraseri,ga,nc,tn,va。其分布區(qū)域包含ga,nc,tn和 va 四個地區(qū),將這四個地區(qū)逐個與 str 中全部 68 個元素比較。 假設這四個地區(qū)分別存在于 str 中的第 0,1,2,3 位置,則將為該數(shù)據(jù)對象設置的字符串數(shù)組中第 0,1,2,3 位置全部置為 1 。文檔大全實用標準文案數(shù)據(jù)預處理代碼 ( 包括數(shù)據(jù)清理和數(shù)據(jù)變換) :publicArrayList<String> getRaw_DataSet() ArrayList<String> raw_dataSet =newA

6、rrayList<String>();/定義集合存儲從本地獲取的數(shù)據(jù)BufferedReader bufferedReader =null ;FileReader fileReader =null ;File dataFile =newFile( this .fileName);if (dataFile.exists() /如果數(shù)據(jù)文件存在tryfileReader =newFileReader(this .fileName);bufferedReader =newBufferedReader(fileReader);String data =null ;while(data =

7、bufferedReader.readLine() !=null ) if (isRightData(data)raw_dataSet.add(data); catch(Exception e) e.printStackTrace(); elsethis .isFileExit= false ;returnraw_dataSet;文檔大全實用標準文案/ getRaw_DataSet,從本地 txt 文件獲取數(shù)據(jù)集publicArrayList<DataItem> getFinished_DataSet() /獲取經(jīng)過預處理,用來進行聚類的數(shù)據(jù)ArrayList<DataIte

8、m> finished_DataSet =newArrayList<DataItem>();ArrayList<String> temp_DataSet =this .getRaw_DataSet();for(inti = 0; i < temp_DataSet.size(); i+) ArrayList<String> eachRomItem =null ;eachRomItem =this .spilt(temp_DataSet.get(i),',' );/除去 "," 后的每一行數(shù)據(jù)DataItem da

9、ta_Item =newDataItem(eachRomItem,true );finished_DataSet.add(data_Item);/ forreturnfinished_DataSet;publicbooleanisRightData(String data) /篩選出合適的數(shù)據(jù)ArrayList<String> tempArrayList =newArrayList<String>();tempArrayList = spilt(data,' ' );if (tempArrayList.size() <= 1)returnfalse

10、 ;returntrue ;/ isRightData,篩選出合適的數(shù)據(jù)文檔大全實用標準文案publicArrayList<String> spilt(String str,charch) ArrayList<String> words =newArrayList<String>();/用來存放找到的單詞int beginIndex = 0;for(inti = 0; i < str.length(); i+) if (str.charAt(i) != ch) if (i != str.length() - 1)continue;else words.

11、add(str.substring(beginIndex); else String temp = str.substring(beginIndex, i);words.add(temp);beginIndex = i + 1;/ forreturnwords;3. 聚類分析3.1算法描述本實驗采用了聚類分析中常用的K 均值 (K-Means) 算法。該算法思想如下:文檔大全實用標準文案算法:K 均值。用于劃分的K 均值算法,每個簇的中心用簇中對象的均值表示。輸入:k :簇的屬目D :包含 n 個對象的數(shù)據(jù)集。輸出:k 個簇的集合。方法:(1)從 D 中任意選擇 k 個對象作為初始簇中心;(2

12、) repeat(3) 根據(jù)簇中對象的均值,將每個對象 (再)指派到最相似的簇;(4) 更新簇均值,既計算每個簇中對象的均值;(5) until 不再發(fā)生變化根據(jù)上述算法,結(jié)合本實驗實際情況和數(shù)據(jù)集特征給出程序的執(zhí)行流程圖:開始從本地讀取數(shù)據(jù)文件數(shù)據(jù)預處理輸入 k,簇的個數(shù)在數(shù)據(jù)集中隨機選取k 個數(shù)據(jù)對象作為初始中心點迭代開始。將數(shù)據(jù)集中每個數(shù)據(jù)對象與 k 個中心點作比較,把每個對象分到與其 最相似 的中心點所在的簇中計算每個簇中對象的均值,作為該簇新的中心點滿足迭代終迭代終止,輸出結(jié)果。止條件文檔大全實用標準文案是否圖 2 程序執(zhí)行流程針對上面的流程圖,有幾點說明:1.數(shù)據(jù)預處理主要包括前述

13、數(shù)據(jù)清理和數(shù)據(jù)變換,最終生成用于聚類分析的數(shù)據(jù)集。2.簇的個數(shù) k 由用戶指定, k 越大聚類過程耗時越久。3.圖中“最相似” 意思就是距離中心點距離最近,本實驗中采用歐幾里得距離,其定義如下:d (i, j ) ( xi1222x j1)(xi 2 x j 2) .(xin x jn )其中 i( xi1 , xi 2 ,., xin ) 和 j( xj1 , xj 2 ,. xjn ) 是兩個 n維數(shù)據(jù)對象。在本實驗中,x 和 x 分別代表為 i,j 兩個數(shù)據(jù)對象設置的字符串數(shù)組 (參看 2.2) 中下標為 1 的i 1j1元素值,此處 n 為 68 。4.流程圖中的終止條件指的是:前后兩

14、次中心點之間的距離(仍然用歐幾里得距離 )是否小于設定的值。 例如,第 n 次迭代完成后重新生成了k 個新的中心點,計算 k 個新中心點與 k 個舊的中心點距離之和并將結(jié)果與設定的值比較,若小于文檔大全實用標準文案設定值則終止迭代,聚類完成,否則繼續(xù)迭代。3.2算法實現(xiàn)圖 3 代碼文件的組織結(jié)構(gòu)上圖是本實驗源碼的組織結(jié)構(gòu),該項目包含五個Java 類。每個類的功能描述如下:Cluster.java類 該類定義了簇的結(jié)構(gòu),包含簇標志,簇成員和簇中心點三個字段。該類的每一個實例對應于聚類過程中的一個簇。DataItem.java類 該類定義了數(shù)據(jù)對象的結(jié)構(gòu),主要包含數(shù)據(jù)對象名稱( 即植物名稱 )和數(shù)

15、據(jù)對象字符串數(shù)組(即植物的分布區(qū)域) 。該類的每一個實例對應于數(shù)據(jù)集中的一個數(shù)據(jù)對象。Main.java類 該類是程序的核心類,主要功能是執(zhí)行聚類過程,包括中心點的選取與更新,計算各個數(shù)據(jù)對象與中心點之間的距離并把其派分到最相似的簇等。ReadData.java類 該類主要功能是生成聚類過程適用的數(shù)據(jù)集,包括讀取文件,數(shù)據(jù)預處理等。Tools.java類 該類是一個工具類,其中定義了多個程序中使用到的靜態(tài)方法。Mian.java類中的核心代碼:(1) 隨機選取中心點publicvoidsetCenter_ran() /第一次,從數(shù)據(jù)集中隨機選取中心點文檔大全實用標準文案beginTime= S

16、ystem. currentTimeMillis();System. out .println("聚類過程開始 ,開始于 :" + Tools.currentTime();Random ran =newRandom();int order = 0;/ 隨機選取中心點while(this.center .size() <numOfCluster) order = ran.nextInt(toBeProcessed.size();if(Tools. isProCener (toBeProcessed.get(order),this .center)this .center

17、.add(toBeProcessed.get(order);/ while(2) 初始化簇集合publicvoidinitArrayCluster(ArrayList<DataItem> center) /初始每個簇中的中心點屬性this .arrayCluster.clear(); /把簇集合清空for(inti = 0; i < center.size(); i+) Cluster cluster =newCluster(i, center.get(i);if (this .center .get(i).getIsDataItem()cluster.addMembers(

18、center.get(i);this .arrayCluster.add(cluster);(3) 執(zhí)行聚類過程 ( 計算距離,把數(shù)據(jù)對象派分到最相似簇中)文檔大全實用標準文案publicvoidrunCluster(ArrayList<DataItem> center) int beyondIndex = 0;/ 判斷數(shù)據(jù)項屬于哪一個簇,初始默認為是0 簇Random rd =newRandom(); / 隨機函數(shù)printBeginInfo();/打印以此迭代開始前的信息。for(inti = 0; i <toBeProcessed.size(); i+) beyondI

19、ndex = 0;booleanisAlreadyExitInCluster =true ;/標記當前處理的數(shù)據(jù)對象是否已經(jīng)存在于某個簇中doubleminDistance = Tools.calcDistance (toBeProcessed.get(i),center.get(0), 0);intranIndex = rd.nextInt(center.size();/隨機產(chǎn)生一個中心點集合的索引for( int j = 0; j < center.size(); j+) /分別與每一個中心點進行比較if (center.contains(toBeProcessed.get(i)/如

20、果正在處理的數(shù)據(jù)對象存在于中心點集合中,則跳出循環(huán)break;isAlreadyExitInCluster =false ;if (ranIndex >= center.size()ranIndex = ranIndex % center.size();doublecorrentDistance = Tools.calcDistance (toBeProcessed.get(i), center.get(ranIndex), 0);if (correntDistance < minDistance) minDistance = correntDistance;文檔大全實用標準文案b

21、eyondIndex = ranIndex;/第二個ifranIndex+;/第二個forif (!isAlreadyExitInCluster) this .arrayCluster.get(beyondIndex).addMembers(toBeProcessed.get(i); /把數(shù)據(jù)對象加入到對應的簇中/第一個 forSystem. out .println("第 " + this .count+ " 次迭代完成。");printClusteringInfo();(4) 迭代過程 ( 產(chǎn)生新的中心點,繼續(xù)執(zhí)行聚類過程直至滿足終止條件)publi

22、cvoidfinishCluster() DecimalFormat df =newDecimalFormat("#.000");/格式化數(shù)據(jù),保留三位小數(shù)for(inti = 0; i <NUM ; i+) doublemoveDistance = 0.0;/存放各個簇新舊中心點歐幾里得距離之和/重新計算簇中心點for( int j = 0; j <numOfCluster; j+) booleanisEmptyCluster =true ;DataItem newCenterItem;/聲明新的中心點對象文檔大全實用標準文案int size =this .a

23、rrayCluster.get( j).getMembers().size();double newCenterArea =newdouble NUMOFAREA ;/ 計算簇中數(shù)據(jù)的均值for (intindex = 0; index <NUMOFAREA ; index+) doubletempValue = 0.0;/暫存每一列區(qū)域值的加和for ( intk = 0; k < size; k+) isEmptyCluster =false ;tempValue +=this .arrayCluster.get( j).getMembers().get(k).getAreas

24、()index;if (!isEmptyCluster) newCenterAreaindex = Double.valueOf (df.format(tempValue / size); elsebreak ;/第三個forif (!isEmptyCluster) /如果簇不為空String name ="cluster"+ j;newCenterItem =newDataItem(name, newCenterArea,false );/新的簇中心點對象DataItem oldCenter =this .center .get( j); /獲取舊的簇中心點moveDis

25、tance += Tools.calcDistance (oldCenter,文檔大全實用標準文案newCenterItem, 0);/計算新舊中心點移動的距離this .center .remove(j); /更新簇中心點集合this .center .add( j, newCenterItem);/第二個for, 重新計算簇中心/ System.out.println(this.center.toString();/打印新的中心點信息if (moveDistance <EXIT * numOfCluster) break ;count +;initArrayCluster(this

26、.center );runCluster(this .center );/第一個 for3.3問題與改進聚類分析要求不同簇之間的距離盡可能大,初始隨機選取的中心點并不能保證不同中心點之間的距離盡可能遠,本程序?qū)λ惴ㄟM行改進, 在隨機選取中心點時要求與已經(jīng)選取的中心點之間的距離大于設定值。這樣做保證了隨機選取的中心點相對比較分散,提高了聚類效果。主要代碼如下:publicstaticbooleanisProCener(DataItem centerItem,/判斷是不是合適的中心點ArrayList<DataItem> center) if (center.size() > 0) /如果當前的中心點集合不為空文檔大全實用標準文案for( int i = 0; i < center.s

溫馨提示

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

評論

0/150

提交評論