当前位置 博文首页 > ?:R语言与数据分析练习:K-Means聚类

    ?:R语言与数据分析练习:K-Means聚类

    作者:[db:作者] 时间:2021-07-17 19:07

    R语言与数据分析练习:K-Means聚类

    k-means实现

    k-means算法,是一种最广泛使用的聚类算法。k-means以k作为参数,把数据分为k个组,通过迭代计算过程,将各个分组内的所有数据样本的均值作为该类的中心点,使得组内数据具有较高的相似度,而组间的相似度最低。

    k-means工作原理

    1. 初始化数据,选择k个对象作为中心点。
    2. 遍历整个数据集,计算每个点与每个中心点的距离,将它分配给距离中心最近的组。
    3. 重新计算每个组的平均值,作为新的聚类中心。
    4. 上面2-3步,过程不断重复,直到函数收敛,不再新的分组情况出现。

    k-means聚类,适用于连续型数据集。在计算数据样本之间的距离时,通常使用欧式距离作为相似性度量。k-means支持多种距离计算,还包括maximum, manhattan, pearson, correlation, spearman, kendall等。各种的距离算法的介绍,请参考文章R语言实现46种距离算法

    kmeans()函数实现

    在R语言中,我们可以直接调用系统中自带的kmeans()函数,就可以实现k-means的聚类。同时,有很多第三方算法包也提供了k-means的计算函数。当我们需要使用kmeans算法,可以使用第三方扩展的包,比如flexclust, amap等包。

    题目:

    在篮球运动中,一般情况下,控球后卫与得分后卫的助攻数较多,小前锋的得分数较多,而大前锋与中锋的助攻数与得分数较少。下表为21名篮球运动员每分钟助攻数和每分钟得分数的数据集,请运用K-Means聚类算法将这21名篮球运动员划分为5类,并通过画图判断他们分别属于什么位置。

    数据如下:

    assists_per_minute为每分钟助攻次数
    points_per_minute为每分钟得分数

    在这里插入图片描述

    实现代码:

    # 切换路径,导入数据
    setwd('D:/bigdata/R语言与数据分析/data03') # 这里是自己数据存放的路径
    basketballdata <- read.csv("data.csv",stringsAsFactors = F) # 数据读取
    
    # 新建一个与源数据有效数据等长的矩阵
    outfile <- matrix(data=NA, 
                      nrow = nrow(basketballdata), 
                      ncol = 2, 
                      byrow = TRUE, 
                      dimnames = list(c(1:nrow(basketballdata)),
                                      c("assists_per_minute","points_per_minute")))
    
    # 读取源数据,写入新建的矩阵
    outfile[,1] <- basketballdata[,2]
    outfile[,2] <- basketballdata[,3]
    
    # 输出数据,存到本地
    summary(outfile)#将字符串存储为文件 采用Base64解码
    write.csv(outfile,'datachange.csv',row.names = FALSE)
    
    # 数据去中心化后的标准化
    basketballdata <- read.csv('datachange.csv', header = TRUE)
    zscoredfile <- scale(basketballdata)
    
    # 数据写出
    write.csv(zscoredfile, 'standardizeddata.csv',row.names = FALSE)
    inputfile <- read.csv('standardizeddata.csv', header = TRUE)
    
    # 聚类分析--5个簇心,调用kmeans算法
    result <- kmeans(inputfile, 5)
    
    # 结果输出
    type <- result$cluster
    type# 查看类别分布
    table(type)  # 查看类别统计
    
    centervec <- result$center
    centervec # 查看簇中心点
    
    # centervec对列取最大值
    max <- apply(centervec,2,max) 
    max
    
    # centervec对列取最小值
    min <- apply(centervec,2,min)
    min
    
    # 构建frame类型数据
    df = data.frame(rbind(max,min,centervec))
    df
    
    # 绘制聚类散点图
    # 如果本地没有factoextra和cluster包,先用以下命令进行下载
    # install.packages('factoextra')
    # install.packages('cluster')
    library(cluster)
    library(factoextra)
    fviz_cluster(result,basketballdata)
    

    运行结果:

    在这里插入图片描述

    对球员的数据进行分析:

    第一组(蓝色部分)与第二组(棕色部分)的每分钟助攻次数较多,所以对应控球后卫与得分后卫。又因为得分后卫的每分钟得分数多于控球后卫,所以第一组(蓝色部分)为控球后卫,第二组(棕色部分)为得分后卫。
    第三组(紫色部分)的每分钟得分数较多,所以对应小前锋
    第四组(绿色部分)和第五组(红色部分)的每分钟助攻次数及每分钟得分数较少,所以对应大前锋与中锋。又因为中锋每分钟得分数多于大前锋,所以,第四组(绿色部分)为大前锋,第五组(红色部分)为中锋。

    推测出每个球员的位置:

    第一组(蓝色部分)为控球后卫
    (第一组:9,11,15,21)
    第二组(棕色部分)为得分后卫
    (第二组:6,7,18)
    第三组(紫色部分)为小前锋
    (第三组:2)
    第四组(绿色部分)为大前锋
    (第四组:10,12,14,17,20)
    第五组(红色部分)为中锋
    (第五组:1,3,4,5,8,13,16,19)

    cs