前言
學習數(shù)據(jù)挖掘已經(jīng)有一段時間了糕再,相關的文章和書也看了一些送悔,感覺學習這個的關鍵還是離不開其中形形色色的算法荒适。作為一個初學者梨熙,我們也不奢求創(chuàng)新改進個算法。先從基礎做起刀诬,學會各個基礎算法的思想與實現(xiàn)咽扇。學習算法的過程是十分枯燥的,但是如果學習的過程能夠?qū)嵺`陕壹,例如使用R語言實踐一下质欲,將一堆頭痛眼花的數(shù)據(jù)轉(zhuǎn)化成一張炫酷的圖,這無疑是十分有成就感的糠馆。所以把敞,我就最近學習的資料,整理了一些算法與R語言的實現(xiàn)方法分享一下榨惠。由于篇幅的問題,后面提到的函數(shù)我都沒有詳細介紹了盛霎,想了解的可以使用>?函數(shù)名
或>??函數(shù)名
查看赠橙。
分類
1、KNN算法
K——最臨近方法(k Nearest Neighbors愤炸,簡稱KNN)是實際運用中經(jīng)常被采用的一種基于距離的分類算法期揪。
基本思想:
假定每個類包含多個訓練數(shù)據(jù),且每個訓練數(shù)據(jù)都有一個唯一的類別標記规个,計算每個訓練數(shù)據(jù)到待分類元組的距離凤薛,取和待分類元組距離最近的k個訓練數(shù)據(jù),k個數(shù)據(jù)中哪個類別的訓練數(shù)據(jù)占多數(shù)诞仓,則待分類元組就屬于哪個類別缤苫。
主要函數(shù):
knn()
加載R中的class庫:
>library(class)
實例:
>data(iris3)
#選取前30個數(shù)據(jù)作為訓練數(shù)據(jù)
>train<-rbind(iris[1:30,,1],iris[1:30,,2],iris[1:30,,3])
#剩下的作為測試數(shù)據(jù)
>test<-rbind(iris[31:50,,1],iris[31:50,,2],iris[31:50,,3])
>c1<-factor(c(rep("s",30),rep("c",30),rep("v",30)))
#進行KNN算法分類
>knn(train,test,c1,k=3,prob=TRUE)
>attributes(.Last.value)
2、決策樹算法(C4,5)
主要函數(shù):
J48()
準備工作:
>install.packages('rJava')
>install.packages('party')
>install.packages('RWeka')
>install.packages('partykit')
>library(RWeka)
>library(party)
實例:
>oldpar=par(mar=c(3,3,1.5,1),mgp=c(1.5,0.5,0),cex=0.3)
>data(iris)
>m1<-J48(Species~.,data=iris)
>m1
>table(iris$Species,predict(m1))
>write_to_dot(m1)
>if(require("party",quietly=TRUE)) plot(m1)
生成樹如下:
3墅拭、CART算法
CART(Classification and Regression Tree活玲,分類與回歸樹)。
主要函數(shù):
tree()
準備工作:
>install.packages('tree')
>library(tree)
實例:
#設置窗口參數(shù)
>oldpar=par(mar=c(3,3,1.5,1),mgp=c(1.5,0.5,0),cex=0.7)
>data(iris)
#對品種進行CART分類
>ir.tr=tree(Species~.,iris)
>summary(ir.tr)
#畫決策樹圖
>plot(ir.tr):text(ir.tr)
生成樹如下:
4、BP神經(jīng)網(wǎng)絡算法
主要函數(shù):
nnet()
準備工作:
>install.packages('nnet')
>library(nnet)
實例:
>data(iris3)
>ir<-rbind(iris3[,,1],iris3[,,2],iris3[,,3])
>targets<-class.ind(c(rep("s",50),rep("c",50),rep("v",50)))
#抽取25個樣本
>samp<-c(sample(1:50,25),sample(51:100,25),sample(101:150,25))
>ir1<-nnet(ir[samp,],targets[samp,],size=2,rang=0.1,decay=5e-4,maxit=200)
>test.c1<-function(true,pred){
true<-max.col(true)
cres<-max.col(pred)
table(true,cres)
}
#對樣本以外的數(shù)據(jù)的測試
>test.c1(targets[-samp,],predict(ir1,ir[-samp,]))
聚類
1舒憾、K-means算法
K-means算法是典型的基于距離的聚類算法镀钓,采用距離作為相似性的評價指標,即認為兩個對象的距離越近镀迂,其相似度就越大丁溅。
主要函數(shù):
kmeans()
實例:
#隨機生成樣本數(shù)據(jù)
>x<-rbind(matrix(rnorm(10000,sd=0.3),ncol=10),matrix(rnorm(10000,mean=1,sd=0.3),ncol=10))
>colnames(x)<-c("x1","x2","x3","x4","x5","x6","x7","x8","x9","x10")
#調(diào)用K-means算法
>c1<-Kmeans(x,2)
>pch1=rep("1",1000)
>pch2=rep("2",1000)
>plot(x,col=c1$cluster,pch=c(pch1,pch2))
>points(c1$centers,col=3,pch="*",cex=3)
2、PAM算法
PAM(Partitioning around Medoid探遵,圍繞中心點的劃分)是最早提出的k-medoids算法之一窟赏。它試圖對n個對象給出k個劃分。最初隨機選擇k個中心點后别凤,該算法反復地試圖找出更好的中心點饰序。
主要函數(shù):
pam()
準備工作:
>library(cluster)
實例:
>pamx=pam(x,2)
>summary(pamx)
>plot(pamx,main="pam效果圖") #數(shù)據(jù)集同上
3、Clara算法
主要思想:不考慮整個數(shù)據(jù)集合规哪,選擇實際數(shù)據(jù)的一小部分作為數(shù)據(jù)的樣本求豫,然后用PAM方法從樣本中選擇中心點。如果樣本是以隨機形式選取的诉稍,它應當足以代表原來的數(shù)據(jù)集合蝠嘉。從中選出的代表對象(中心點)很可能與從整個數(shù)據(jù)集合中選出的非常近似Clara抽取數(shù)據(jù)集合的多個樣本,對每個樣本應用PAM算法杯巨,返回最好的聚類結果作為輸出蚤告。
主要函數(shù):
clara()
準備工作:
>library(cluster)
實例:
>clarax=clara(x,2)
>clarax
>clarax$clusinfo
>plot(clarax,main="clara圖") #數(shù)據(jù)集同上
層次聚類
1、AGNES算法與DIANA算法
AGNES(Agglomerative Nesting)算法是凝聚的層次聚類方法服爷。最初將每個對象作為一個簇杜恰,然后這些簇根據(jù)某些準則一步步地合并,直到所有的對象最終合并到一個簇中或某個終結條件被滿足仍源。
DIANA(Divisive ANAlysis)算法是分裂的層次聚類方法心褐。采用自頂向下的策略,它首先將所有對象置于一個簇中笼踩,然后逐漸細分為越來越小的簇逗爹,直到每個對象自成一簇或某個終結條件被滿足。
主要函數(shù):
agnes()嚎于、diana()
準備工作:
>library(cluster)
實例:
AGNES和DIANA算法的比較
#將圖形顯示區(qū)劃為兩部分
>par(mfrow=c(1,2))
>data(flower)
>dai.f=daisy(flower,type=list(asymm=3,ordratio=7))
>agn.f=agnes(dai.f,method="ward")
>plot(agn.f,which.plot=2,cex=0.7,yaxt="n",main="agnes算法的聚類圖")
>dia.f=diana(dai.f) #注意這里dia.f與dai.f不同
>plot(dia.f,which.plot=2,main="diana算法的聚類圖")
結果圖如下:
基于密度聚類
主要思想:只要臨近區(qū)域的密度(對象或數(shù)據(jù)點的數(shù)目)超過某個閥值,就繼續(xù)聚類肋僧。
優(yōu)點:可以過濾“噪聲”孤立點數(shù)據(jù)女蜈,發(fā)現(xiàn)任意形狀的簇持舆。
1、DBSCAN算法
DBSCAN(Density-Based Spatial Clustering of Application with Noise)是一個有代表性的基于密度的方法伪窖,它根據(jù)一個密度閥值來控制簇的增長逸寓。
主要函數(shù):
DBSCAN()
準備工作:
>library(cluster)
實例:
>dflower<-daisy(flower,type=list(asymm=c("V1","V3"),symm=2,norminal=4,ordinal=c(5,6),ordratio=7,logratio=8))
>DBF=DBSCAN(dflower,eps=0.65,MinPts=5,distances=T)
>DBF
基于模型聚類
1、COBWEB算法
COBWEB是一種流行的簡增量概念聚類算法覆山。它以一個分類樹的形式創(chuàng)建層次聚類竹伸,每個節(jié)點對應一個概念,包含該概念的一個概率描述簇宽,概述被分在該節(jié)點下的對象勋篓。
主要函數(shù):
Cobweb()
準備工作:
>install.packages('RWeka')
>library(RWeka)
實例:
>com=rbind(cbind(rnorm(20,0,0.5),rnorm(20,0,0.5)),cbind(rnorm(30,5,0.5),rnorm(30,5,0.5)))
>clas=factor(rep(2:1,c(20,30)))
>dcom=data.frame(com,clas)
>c1<-Cobweb(dcom)
>c1
>c1$class_ids
>table(predict(c1),dcom$clas)
模糊聚類
1、FCM算法
FCM(Fuzzy C-Means)算法是一個模糊聚類算法魏割,不同于硬劃分譬嚣,模糊聚類方法是一個軟劃分。對于模糊集來說钞它,一個數(shù)據(jù)點都是以一定程度屬于某個類拜银,也可以同時以不周的程度屬于幾個類。
主要函數(shù):
fanny()
準備工作:
>library(cluster)
實例:
>z=rbind(cbind(rnorm(100,0,0.5),rnorm(100,0,0.5)),cbind(rnorm(150,5,0.5),rnorm(150,5,0.5),cbind(rnorm(300,3.2,0.5),rnorm(300,3.2,0.5))))
>z
>fannyz=fanny(z,3,metric="SqEuclidean")
>summary(fannyz)
>plot(fannyz,main="模糊算法聚類圖")
參考文獻
方匡南. 基于數(shù)據(jù)挖掘的分類和聚類算法研究及R語言實現(xiàn)[D]. 暨南大學, 2007.