R語言實現K-Means演算法資料集iris
博主程式碼根據機器挖掘實戰編寫的.那本書用的是Python.Step By Step. R語言有函式包實現
也可以呼叫,裡面的四個algorithm我怎麼看著都差不多,所以我決定寫一下,明天仔細看一下
kmeans(x, centers, iter.max = 10, nstart = 1,
algorithm = c(“Hartigan-Wong”, “Lloyd”, “Forgy”,
“MacQueen”))
程式碼
#載入iris函式
loadData <- function(){
data(iris)
#要把Species列去掉
dataSet = iris[,-ncol(iris)]
return (dataSet)
}
#計算歐幾里得距離
distEnclud <- function(vecA,vecB){
distEnclud = sqrt(apply((vecA-vecB)^2,1,sum))
return (distEnclud)
}
#設定初始族
randCent <- function(dataSet,k){
n = ncol(dataSet)
#建立一個空矩陣
centroids = matrix(data = NA, nrow = k, ncol = n, byrow = FALSE,dimnames = NULL)
#隨機設定初始族
for(j in 1:n){
minJ = min(dataSet[,j])
rangeJ = max(dataSet[,j]) - minJ
#隨機生成每一列的初始簇
centroids[,j] = minJ + rangeJ *runif(k)
}
return (centroids)
}
kMeans <- function(dataSet,k,distEnclud, randCent){
m = nrow(dataSet)
#記錄矩陣,一列記錄簇索引值,即類別,第二列記錄誤差
clusterAssment = matrix(data = 0, nrow = m , ncol = 2,byrow = FALSE,dimnames = NULL)
#初始族
centroids = randCent(dataSet,k)
#初始簇列名和資料集列名相同
colnames(centroids) = colnames(dataSet)
clusterChanged = TRUE
#設定結束變數,如果為TRUE 說明族中心點和分類結果還有變化,所以要繼續分類,若沒有改變則設定為FALSE 跳出迴圈
while (clusterChanged) {
clusterChanged = FALSE
for(i in 1: m){
minDist = Inf
minIndex = -1
for(j in 1:k){
distJI = distEnclud(dataSet[i,],centroids[j,])
if(is.na(distJI)) distJI = Inf
if(distJI < minDist){
minDist = distJI
minIndex = j
}
}
if(clusterAssment[i,1] != minIndex){
clusterChanged = TRUE
clusterAssment[i,1] = minIndex
}
clusterAssment[i,2] = minDist^2
}
#每計算一遍 都要 updata center
for(cent in 1:k){
ptsCluster = dataSet[which(clusterAssment[,1] == cent),]
centroids[cent,] = apply(ptsCluster,2,mean)
}
}
#小技巧 R語言返回幾個矩陣時 可用list將其組合,返回後再如取list元素一邊取出就好
out = list(clusterAssment = clusterAssment ,centroids = centroids)
return (out)
}
###########呼叫函式程式碼,只需3行,簡單吧
#dataSet = loadData()
#head(dataSet)
#output = kMeans(dataSet,2,distEnclud,randCent)
#繪製Sepal.Length,Sepal.Width 兩列
plot(dataSet[c("Sepal.Length","Sepal.Width")],col = output$clusterAssment[,1])
points(output$centroids[,1],output$centroids[,2],col = 1:2,pch = 8,cex = 2)
#繪製Petal.Length,Petal.Width 兩列
plot(dataSet[c("Petal.Length","Petal.Width")],col = output$clusterAssment[,1])
points(output$centroids[,3],output$centroids[,4],col = 1:2,pch = 8,cex = 2)
table(iris$Species, output$clusterAssment[,1])
根據Sepal.Length,Sepal.Width 兩列兩列畫出的圖形
根據Petal.Length,Petal.Width 兩列畫出的圖形
相關文章
- R語言實戰(1) 資料集的建立R語言
- FCM聚類演算法詳解(Python實現iris資料集)聚類演算法Python
- R語言批量建立資料框R語言
- R語言資料質量分析R語言
- R語言連線資料庫(MySQL)R語言資料庫MySql
- R語言入門與資料分析R語言
- 地理探測器R語言實現:geodetectorR語言
- R語言學習-高階資料管理R語言
- 【R語言入門】R語言中的變數與基本資料型別R語言變數資料型別
- r語言R語言
- 排序演算法-C語言實現排序演算法C語言
- 聚類演算法與K-means實現聚類演算法
- 《R語言入門與資料分析》——向量索引R語言索引
- R語言批量提取excel當中的資料R語言Excel
- 【R語言入門】R語言環境搭建R語言
- 開發技術分享:美團R語言資料運營實戰!R語言
- PID演算法的C語言實現演算法C語言
- SMOTE與SMOGN演算法R語言程式碼演算法R語言
- 協同過濾的R語言實現及改進R語言
- 使用 R 語言實現簡單的文字識別程式
- R 語言使用
- [譯] Scratch 平臺的神經網路實現(R 語言)神經網路
- 資料結構與演算法分析(c 語言描述)基數排序 陣列實現資料結構演算法排序陣列
- python實現之 K-means演算法簡單介紹Python演算法
- 【資料結構】迴圈佇列 C語言實現資料結構佇列C語言
- 共識演算法PoS及Go語言實現演算法Go
- C語言實現九大排序演算法C語言排序演算法
- 如何用 4 行 R 語句,快速探索你的資料集?
- 在資料科學領域,Python語言和R語言有何區別?資料科學PythonR語言
- 資料結構與演算法分析(c 語言描述)多項式 ADT 陣列實現資料結構演算法陣列
- R語言快速入門R語言
- R語言:畫樹圖R語言
- 什麼是r語言R語言
- R語言函式-tolowerR語言函式
- 資料結構c語言實現順序表基本操作資料結構C語言
- 用c語言實現資料結構——單連結串列C語言資料結構
- 資料結構——單連結串列介面實現(C語言)資料結構C語言
- 想要從事資料分析,選擇python還是R語言呢?PythonR語言
- python和R語言哪個好?哪個適合資料分析?PythonR語言