日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

r语言kmeans聚类(真实案例完整流程)

發布時間:2023/12/14 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 r语言kmeans聚类(真实案例完整流程) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

K-means介紹

k-means算法簡介:

K-means算法是IEEE 2006年ICDM評選出的數據挖掘的十大算法中排名第二的算法,排名僅次于C4.5算法。K-means算法的思想很簡單,簡單來講就是對于給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大,兩個對象之間的距離越近,相似性越高。聚類的結果就是使類內部的同質性高,而類之間的異質性高。

k-means算法的具體工作流程如下:

step1:導入一組具有n個對象的數據集,給出聚類個數k;
step2:從n個對象中隨機取出k個作為初始聚類中心;
step3:根據歐幾里得距離來判斷相似度量,確定每個對象數據哪個簇;
step4:計算并更新每個簇中對象的平均值,并將其定為每個簇的新的聚類中心;
step5:計算出準則函數E;
step6:循環step3,step4,step5直到準則函數E在允許的誤差范圍內;

k-means算法的幾個主要特點:

  • 發現球形互斥的簇:由于K-means算法一般是以歐幾里得距離作為相似性度量指標,所以K-means算法對于球形互斥的簇的聚類效果會比較好;
  • 對低維數據集效果較好:同樣的數據量,維度越高,數據矩陣越稀疏,當數據維度比較高時,數據矩陣是一個稀疏矩陣,K-means算法稀疏矩陣數據聚類效果不佳;
  • 容易陷入局部最優:對于K-means算法來說,初始聚類中心的確定十分重要,因為不同的聚類中心會使算法沿著不同的路徑搜索最優聚類結果,不過對于陷入局部最優這個問題可以從初始聚類中心的選擇來進行改進。

R語言編程實現:

##### 案例數據 ######### setwd("E:/data") data_model <- read.csv("data.csv",header = T) data_model_1 <- data_model[,1:4] head(data_model_1)

######## 數據查看 ############### dim(data_model_1) str(data_model_1) summary(data_model_1)

# y~V1-Vn數據相關性探索 (data_cor <- cor(data_model_1)) library(car) scatterplotMatrix(data_model_1)

相關關系不是特別明顯,進行量化表現:

library(corrplot) corrplot(corr = data_cor, method = 'color', addCoef.col="grey")

可以明顯看出y和V1、V2呈負相關關系,系數分別為-0.15及-0.07,y和V3呈正相關關系,且系數較高為0.22。

K-means模型訓練

data <- data_model_1[,2:4]

定義kmeans聚類函數My_Kmeans

#默認的最大迭代次數為10 My_kmeans <- function(data,k,max.iter=10){rows <- nrow(data) cols <- ncol(data) within <- matrix(0,nrow=k,ncol=1) between <- 0iter = 0#定義indexMatrix矩陣,第一列為每個數據所在的類,第二列為每個數據到其類中心的距離indexMatrix <- matrix(0,nrow=rows,ncol=2) centers <- matrix(0,nrow=k,ncol=cols) randSeveralInteger <- as.vector(sample(1:rows,size=k))#通過生成隨機數的方式,得到初始的聚類中心for(i in 1:k){indexMatrix[randSeveralInteger[i],1] <- icenters[i,] <- data[randSeveralInteger[i],]centers <- matrix(centers,k,cols)}changed = TRUE while(changed){ if(iter >= max.iter)breakchanged=FALSE#對每一個數據,計算其到各個類中心的距離,并將其劃分到距離最近的類for(i in 1:rows){ initialDistance <- 10000 previousCluster <- indexMatrix[i,1]#遍歷所有的類,將該數據劃分到距離最近的類for(j in 1:k){ currentDistance <- (sum((data[i,]-centers[j,])^2))^0.5if(currentDistance < initialDistance){initialDistance <- currentDistance indexMatrix[i,1] <- j indexMatrix[i,2] <- currentDistance } }#如果該數據所屬的類發生了變化,則將changed設為TRUE,算法繼續if(previousCluster!=indexMatrix[i,1]) changed=TRUE}#重新計算類中心for(m in 1:k){clusterMatrix <- data[indexMatrix[,1]==m,] clusterMatrix <- as.matrix(clusterMatrix)if(nrow(clusterMatrix)>0){ centers[m,] <- colMeans(clusterMatrix) } else{centers[m,] <- centers[m,] } }iter = (iter+1) }

參數注釋:

  • data:表示待聚類的數據
  • k:要聚類的數目
  • max.iter:聚類的最大迭代次數,默認值是10
  • cluster:聚類的結果,也就是每個對象所屬的類
  • tot.withinss:聚類的總的類內平方和,用來衡量類內差異
  • betweenss:聚類的類間平方和,用來衡量類間差異

原始數據標準化

min.max.norm <- function(x){((x-min(x))/(max(x)-min(x))) }data <- apply(data,2,min.max.norm)

確定最優K

# k取2到8,評估K library(fpc) K <- 2:8 round <- 10 # 每次迭代10次,避免局部最優 rst <- sapply(K, function(i){print(paste("K=",i))mean(sapply(1:round,function(r){print(paste("Round",r))result <- My_kmeans(data, i)stats <- cluster.stats(dist(data), result$cluster)stats$avg.silwidth})) })# 可以看到如下的示意圖 plot(K,rst,type='l',main='輪廓系數與K的關系', ylab='輪廓系數') #輪廓系數越大越好

可以看出,當K=3時,輪廓系數最大,因此我們取K=3。

實際數據檢驗函數

result <- My_kmeans(data,k=3) #進行聚類 result$cluster result$tot.withinss result$betweenss result$iteration

聚類結果可視化

plot(data_model$V1,data_model$V3,col=result$cluster,main="My_kmeansClustering",pch=19)

聚類結果導出

result_output <- data.frame(data_model[,1:4],result$cluster)write.csv(result_output,file="result_output.csv",row.names=T,quote=F)

三個分群的概率密度函數圖

Data1 <- data_model[,2:4][which(result_output$result.cluster==1),] Data2 <- data_model[,2:4][which(result_output$result.cluster==2),] Data3 <- data_model[,2:4][which(result_output$result.cluster==3),]opar <- par(no.readonly = TRUE) #復制一份單簽的圖形參數 png("kmean.png") par(mfrow = c(3,3)) plot(density(Data1[,1]),col="red",main="R") plot(density(Data1[,2]),col="red",main="F") plot(density(Data1[,3]),col="red",main="M") plot(density(Data2[,1]),col="red",main="R") plot(density(Data2[,2]),col="red",main="F") plot(density(Data2[,3]),col="red",main="M") plot(density(Data3[,1]),col="red",main="R") plot(density(Data3[,2]),col="red",main="F") plot(density(Data3[,3]),col="red",main="M") par(opar)

總結

以上是生活随笔為你收集整理的r语言kmeans聚类(真实案例完整流程)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。