(数据科学学习手札12)K-means聚类实战(基于R)
2023-09-11 14:18:36 时间
上一篇我们详细介绍了普通的K-means聚类法在Python和R中各自的实现方法,本篇便以实际工作中遇到的数据集为例进行实战说明。
数据说明:
本次实战样本数据集来自浪潮集团提供的美团的商家信息,因涉及知识产权问题恕难以提供数据地址;
我选择的三个维度的数值型数据分别为“商家评分”,“商家评论数”,“本月销售额”,因为数值极差较大,故对原数据先进行去缺省值-标准化处理,再转为矩阵形式输入K-means算法之中,经Rtsne对原数据进行降维后具体代码和可视化聚类效果如下:
rm(list=ls()) library(readxl) library(Rtsne) setwd('C:\\Users\\windows\\Desktop') data <- read_xlsx('重庆美团商家信息.xlsx') token <- data[1,1] data <- subset(data,数据所属期 == token,select=c('商家评分','商家评论数','本月销售额')) input <- as.matrix(na.omit(data)) #数据标准化 input <- scale(as.matrix(input)) #数据降维 tsne <- Rtsne(input,check_duplicates = FALSE) #自定义代价函数计算函数 Mycost <- function(data,centers_){ l <- length(data[,1]) d <- matrix(0,nrow=l,ncol=length(centers_[,1])) for(i in 1:l){ for(j in 1:length(centers_[,1])){ dd <- 0 for(k in 1:length(data[1,])){ dd <- dd + (data[i,k]-centers_[j,k])^2 } d[i,j] <- sqrt(dd) } } mindist <- apply(d,1,min) return(sum(mindist)) } colors = c('red','green','yellow','black','blue','grey') #对k的值进行试探 cost <- c() par(mfrow=c(2,3)) for(k in 2:7){ cl <- kmeans(input,centers=k) plot(tsne$Y,col=colors[cl$cluster],iter.max=50) title(paste(paste('K-means Cluster of ',as.character(k),'Clusters'))) cost[k-1] <- Mycost(input,cl$centers) } #绘制代价函数变化情况 par(mfrow=c(1,1)) plot(2:7,cost,type='o',xlab='K',ylab='Cost') title('Cost Change')
代价函数变化情况如下:
根据上述代价函数变化情况,依据肘部法则,选取k=3,下面得到k取定3时具体的聚类结果:
cl <- kmeans(input,centers=3,iter.max=50) plot(tsne$Y,col=colors[cl$cluster]) title(paste(paste('K-means Cluster of ',as.character(3),'Clusters')))
再根据聚类的标号结果,进行下面一系列具体的分析:
先来看这三类的平均销售额:
anl <- na.omit(data) anl$类别 <- cl$cluster str(anl) type1 <- subset(anl,类别==1) type2 <- subset(anl,类别==2) type3 <- subset(anl,类别==3) goaldata <- matrix(0,nrow=3,ncol=3) goaldata[1,] = apply(type1[,1:3],2,mean) goaldata[2,] = apply(type2[,1:3],2,mean) goaldata[3,] = apply(type3[,1:3],2,mean) barplot(log(t(goaldata[3,])),names.arg = c('Type1','Type2','Type3'),xlab='Type',ylab='对数化数值') title('销售额')
店铺平均评分:
店铺平均评论数:
下面再绘制出这三种type的各指标密度分布:
par(mfrow=c(1,3)) plot(density(type1$商家评分)) plot(density(type1$商家评论数)) plot(density(type1$本月销售额)) par(mfrow=c(1,3)) plot(density(type2$商家评分)) plot(density(type2$商家评论数)) plot(density(type2$本月销售额)) par(mfrow=c(1,3)) plot(density(type3$商家评分)) plot(density(type3$商家评论数)) plot(density(type3$本月销售额))
结合上述可视化结果,我们可以推断:type1代表评分较高但热度和知名度都较低的小店,这类店铺是我们推广宣传业务的最有潜力的客户群;type2代表评分较低且热度和知名度都较低的店,这类店在产品和宣传上都比较差劲,是比较劣质的客户群;type3代表着口碑和热度都较高的顶级店铺,这类店铺多为正新鸡排、一只酸奶牛这样的顶级连锁店铺,在宣传和产品上都很优秀,对我们推广宣传业务来说价值不大,因为已经有很成熟的广告体系。
以上便是此次简单的K-means聚类实战,如有不足望提出。
相关文章
- caffe学习系列(3):数据层介绍
- 史上最全的“大数据”学习资源(上)
- sklearn学习笔记(一)——数据预处理 sklearn.preprocessing
- Python深入学习之特殊方法与多范式
- 细思极恐!大数据和机器学习揭示十二星座的真实面目
- 【学习总结】GirlsInAI ML-diary day-12-for循环
- MOT中的Data Association(三):基于深度学习的端到端数据关联
- 深入学习SAP UI5框架代码系列之七:控件数据绑定的三种模式 - One Way, Two Way和OneTime实现原理比较
- Flutter学习 — 从新页面返回数据给上一个页面
- EL:集成学习(Ensemble Learning)的概念讲解、问题应用、算法分类、关键步骤、代码实现等相关配图详细攻略
- ML之回归预测:利用十类机器学习算法(线性回归、kNN、SVM、决策树、随机森林、极端随机树、SGD、提升树、LightGBM、XGBoost)对波士顿数据集回归预测(模型评估、推理并导到csv)
- DL之VGG16:基于VGG16(Keras)利用Knifey-Spoony数据集对网络架构进行迁移学习
- Python编程语言学习:批量对array数组数据按照条件限制进行替换/修改、横向拼接两个array矩阵数据
- 利用深度学习生成数据的时间序列预测(Matlab代码实现)
- JWT学习
- 学习Spring Boot:(二十五)使用 Redis 实现数据缓存
- Java学习路线-18:数字操作类Math、Random、BigInteger、BigDecimal
- Redis学习资源
- Swift学习笔记十三:继承
- 通过GAN绕过基于机器学习的IDS检测系统,IDSGAN(也是对IDS ML检测算法进行绕过,数据集使用NSL-KDD,DoS、U2R、R2L三种攻击)——也有最新防御的方法
- HashMap设计思想学习
- 深度学习笔记:使用预训练模型之模型微调+数据增强
- 如何获取和处理数据以供机器学习使用?
- 如何获取机器学习方面的数据?哪些渠道可以下载数据集?
- 基于深度学习的三维重建网络PatchMatchNet(二):dtu数据集介绍及PatchMatchNet中加载数据部分代码解析
- 基于深度学习的三维重建(一):三维重建简介、patchmatchNet环境部署、用colmap如何测试自己的数据集