一、一些聚类,分类算法
1.k-means
http://blog.sina.com.cn/s/blog_4ac9f56e0101h8xp.html
2.系统 层次
http://blog.sina.com.cn/s/blog_615770bd01018dnj.html
3.文本分类 knn
http://blog.csdn.net/cl1143015961/article/details/44413631
二、例子:k-means, 系统,k-中心,knn,svm,kernel聚类
其中knn方法可以替代一中的3方法
1.层次聚类
library(tm)
reut21<-system.file('texts','crude',package = 'tm')
reuts<-Corpus(DirSource(reut21),readerControl = list(reader = readReut21578XML) )
data(crude)
data(acq)
#词条文档
crudeTDM<-TermDocumentMatrix(crude,control = list(stopwords = TRUE))
inspect(crudeTDM)
##dissimilarity(crudeTDM,method ='cosine') 新版没有了
#crudeDTM <- removeSparseTerms(crudeDTM, 0.8) #可以选择去除权重较小的项
crudeTDM.matrix <- as.matrix(crudeTDM)
##距离矩阵
dist(crudeTDM.matrix,method = 'euclidean')
inspect(acq)
m<-c(acq,crude) ##组合
dtm<-DocumentTermMatrix(m)
dtm<-removeSparseTerms(dtm,0.8)
inspect(dtm)
ditm<-dist(dtm,method = 'euclidean')
hc<-hclust(ditm,"average")
plot(hc,xlab = 'xzhou')
re<-rect.hclust(hc,k=2,border="red")
2.K-means聚类
kmeans R中不用提供距离矩阵
k<-kmeans(dtm,2)
summary(k)
mode(k) #kmeansRes的内容
names(k)
k$cluster #聚类结果
k$size #每个类别下有多少条数据
#sort(kmeansRes$cluster) #对分类情况进行排序
'''
"cluster"是一个整数向量,用于表示记录所属的聚类
"centers"是一个矩阵,表示每聚类中各个变量的中心点
"totss"表示所生成聚类的总体距离平方和
"withinss"表示各个聚类组内的距离平方和
"tot.withinss"表示聚类组内的距离平方和总量
"betweenss"表示聚类组间的聚类平方和总量
"size"表示每个聚类组中成员的数量
'''
3.k中心聚类
注意这个x可以是数据矩阵或者距离矩阵
library(cluster)
pa<-pam(ditm,2) #分两类
summary(pa)
4.knn算法 最近邻算法 做分类
library('class') #knn所在包
library('kernlab')
install.packages('kernlab')
data(spam)
View(spam)
##训练集,垃圾邮件和非垃圾邮件
train <- rbind(spam[1:1360, ], spam[1814:3905, ])
trainCl <- train[,"type"] ##分类,就是给加了一个分类的列
View(train)
test <- rbind(spam[1361:1813, ], spam[3906:4601, ])
trueCl <- test[,"type"]
##去除原来有分类的列
knnCl <- knn(train[,-58], test[,-58], trainCl)
##table("1-NN" = knnCl, "Reuters" = trueCl)对角线
(nnTable <- table("1-NN" = knnCl, "Reuters" = trueCl))
sum(diag(nnTable))/nrow(test) #查看分类正确率
#提取对角线或者构造对角线矩阵
diag
5.支持向量机svm
##type ~ .表示,用type来分类
ksvmTrain <- ksvm(type ~ ., data = train)
svmCl <- predict(ksvmTrain, test[,-58])
(svmTable <- table("SVM" = svmCl, "Reuters" = trueCl))
sum(diag(svmTable))/nrow(test)
5.软件包kernlab中的specc()方法可以实现kernel聚类算法。用这个聚类可能效果不是很理想
例子:
a=c(3,3,3,5,5,6,6,3,5,3,7,9,5,7)
data<-matrix(data=a,ncol=2,byrow=FALSE)
library(kernlab)
stringkern <-stringdot(type="string")
kernelRes <-specc(data,centers=2,kernel=stringkern)
mode(kernelRes)