算法可以分为三种类型:监督学习、无监督学习和强化学习。K-means聚类是一种无监督的机器学习技术。当输出或响应变量未提供时,这种算法被用来将数据分类到不同的簇中,以便更好地理解数据。它也被称为数据驱动的机器学习方法,因为它根据数据中的隐藏模式、洞察力和相似性对数据进行聚类。
考虑下面的图表:如果被要求将图片中的人分成不同的簇或组,而对这些人一无所知,无疑会尝试找到这些人共享的品质、特征或身体属性。观察这些人后,得出结论,他们可以根据身高和体重进行分类;鉴于对这些人没有先验知识。K-means聚类执行的工作大致相同。它试图根据相似性和隐藏模式对数据进行分类。K-means聚类中的“K”指的是算法将在数据中生成的簇的数量。
1) 算法随机选择k个质心,如图1所示。这里的k是算法将要创建的簇的数量。假设希望算法从数据中创建两个簇,那么将k的值设置为2。
2) 然后,它使用从两个质心计算出的距离将数据分成两部分,如图2所示。每个点到两个质心的距离分别计算,然后将点添加到距离最短的质心组中。算法还绘制了一条连接两个质心的线和一条垂直于它的线,试图将数据分成两组。
3) 一旦所有数据点根据它们与相应质心的最小距离被分组,算法随后计算每个组的平均值。然后比较每个组的均值和质心值。如果质心值与均值不同,则将质心移动到组的均值。如图3所示,红色和蓝色质心都移动到组的均值。
4) 再次计算均值并与新生成的组的质心进行比较。如果它们不同,质心将再次移动到组的均值。这个过程一直迭代,直到质心值和均值相等(质心值=组均值)。这是算法将数据分割成'K'个簇(本例中为2个)的点。
第一步是为k提供一个值。算法执行的每个后续步骤都完全依赖于指定的k值。这个k值帮助算法确定应该生成的簇的数量。这强调了为k提供精确值的重要性。在这里,使用一种称为“肘部方法”的方法来确定k的正确值。这是一个“簇数K”与“总内平方和”的图表。在x轴上绘制k的离散值,而在y轴上绘制簇的平方和。
1) 计算质心与簇中每个点之间的距离,将其平方,然后为簇中的所有点求平方距离之和。
2) 以相同的方式找到剩余簇的平方距离之和。
3) 最后,将所有簇的求和相加,得到“簇内平方和”的值,如下所示。
“总内平方和”随着k值的增加而开始减少。簇数与总内平方和之间的图表如下所示。簇的最优数量,或k的正确值,是值开始缓慢减少的点;这被称为“肘点”,如下所示的肘点是k=4。“肘部方法”因图表类似于肘部而得名,而“k”的最优点是肘点。
1) 不需要标记数据。由于如此多的真实世界数据都是未标记的,因此它经常在各种真实世界问题陈述中使用。
2) 易于实现。
3) 能够处理大量数据。
4) 当数据量较大时,它比层次聚类(对于小k)运行得更快。
1) 需要手动使用“肘部方法”选择K值。
2) 异常值的存在会对聚类产生不利影响。因此,在使用k-means聚类之前,必须消除异常值。
3) 簇不会交叉;一个点一次只能属于一个簇。由于缺乏重叠,某些点被错误地放置在错误的簇中。
将在工作中导入以下库。
library(caret)
library(ggplot2)
library(dplyr)
将使用iris数据进行工作,其中包含三个类别:“Iris-setosa”、“Iris-versicolor”和“Iris-virginica”。
data <- read.csv("iris.csv", header =T)
让看看这三个类别是如何相互关联的。物种“Iris-versicolor”(绿色)和“Iris-verginica”(蓝色)不是线性可分的。正如下面的图表所示,它们是混合的。
data %>% ggplot(aes(SepalLengthCm, SepalWidthCm, color= Species))+
geom_point()
从数据中移除物种列后。现在将使用肘部方法的图表来确定“簇内平方和”和“k值”之间的合适值。在这种情况下,K=3是k的最佳值(注意:原始iris数据中有3个类别,这确保了k值的准确性)。
data <- data[, -5]
maximum <- 10
scal <- scale(data)
wss <- sapply(1:maximum, function(k){kmeans(scal, k, nstart = 50, iter.max = 15)$tot.withinss})
plot(1:max, wss,type="b", xlab = "k values")
对于k=3,应用K-means聚类算法。在这种情况下,K-means聚类方法解释了71.5%的数据变异性。
km <- kmeans(data[,1:2], k=3, iter.max = 50)
km
让看看这三个类别是如何使用k-means聚类进行聚类的。正如所知,K-means聚类不会创建重叠的簇。由于“绿色”和“蓝色”物种在原始数据中不是线性可分的,k-means聚类无法捕捉到这一点,因为它有紧密的簇。
km$cluster <- as.factor(km$cluster)
data %>% ggplot(aes(SepalLengthCm, SepalWidthCm, color= km$cluster))+
geom_point()
文章:Shivam Sharma。
电话:+91 7974280920
电子邮件:[email protected]
LinkedIn:www.linkedin.com/in/shivam-sharma-49ba71183
blogathon
Shivam
遇见Shivam,一位有两年经验的数据科学家,目前在梅赛德斯-奔驰工作。参与了多个与自然语言处理、经典机器学习和深度学习相关的项目。凭借在数据科学方面的学习,还擅长分析复杂数据集,以发现推动业务决策的洞察力和趋势。
初学者