目录
①使用距离来分配和更新类
运算过程如下:
指定k=3,选择初始类中心
计算距离,归类
更新类中心,重新分配
第二轮更新阶段,重新分配
最终聚类结果
②选择适当的聚类数
探寻青少年市场细分
30000名美国高中生的随机案例数据集,在知名社交网络服务中保存了他们的个人资料。将网站页面内容划分单词,36个单词被选来代表5大兴趣类。每个案例包括4个个人特征(毕业年份,性别,年龄,交友数)和36种兴趣。
数据下载:
链接: https://pan.baidu.com/s/1CGkaRPc3glCjI-hWWg1Kug 提取码: 74bm
包括缺失值的查看,缺失值的虚拟编码和缺失值插补等。
## Step 2: Exploring and preparing the data ----
teens <- read.csv("snsdata.csv")
str(teens)
# look at missing data for female variable
table(teens$gender)
table(teens$gender, useNA = "ifany") #计数缺失值
# look at missing data for age variable
summary(teens$age) #包含缺失值统计
# eliminate age outliers
teens$age <- ifelse(teens$age >= 13 & teens$age < 20,
teens$age, NA)
summary(teens$age)
# reassign missing gender values to "unknown"
teens$female <- ifelse(teens$gender == "F" &
!is.na(teens$gender), 1, 0)
teens$no_gender <- ifelse(is.na(teens$gender), 1, 0)
# check our recoding work
table(teens$gender, useNA = "ifany")
table(teens$female, useNA = "ifany")
table(teens$no_gender, useNA = "ifany")
# finding the mean age by cohort
mean(teens$age) # doesn't work
mean(teens$age, na.rm = TRUE) # works
# age by cohort
aggregate(data = teens, age ~ gradyear, mean, na.rm = TRUE)
# create a vector with the average age for each gradyear, repeated by person
# ave函数返回一个具有重复的组均值的向量,使得结果在长度上等于原始向量的长度
ave_age <- ave(teens$age, teens$gradyear,
FUN = function(x) mean(x, na.rm = TRUE))
teens$age <- ifelse(is.na(teens$age), ave_age, teens$age)
# check the summary results to ensure missing values are eliminated
summary(teens$age)
使用基础包的kmeans函数。注意将特征标准化,这里用z-score标准化。
另一个就是k值的指定,比如对人口分析很熟悉,或者对关于自然分组的真是数量有一些预感,也可参考一些资料等,我们将符合年龄的高中生特征确定为5个典型类型(聪明人,运动员,公主,罪犯,无特征)。
## Step 3: Training a model on the data ----
interests <- teens[5:40]
interests_z <- as.data.frame(lapply(interests, scale))
set.seed(2345)
teen_clusters <- kmeans(interests_z, 5)
模型的成功与否在于类对于预期目的是否有用。评估一个类是否有用的最基本方法之一就是检查落在每一组中的案例数,数目过多或过少(如1个或几个),则这些类不太有用。
为深入了解类,可查看聚类质心的坐标。因为已经做了z-score标准化,所以负值表示低于总体均值,正值表示高于总体均值。
## Step 4: Evaluating model performance ----
# look at the size of the clusters
teen_clusters$size
# look at the cluster centers
teen_clusters$centers
通过研究类在特征(兴趣)中的表现,可以构建有一个表来列出每组中的主要兴趣项:
根据聚类结果,可以确定每个案例被分配到了哪一类中,再探究不同的类在原始数据中各特征的差异。
## Step 5: Improving model performance ----
# apply the cluster IDs to the original data frame
teens$cluster <- teen_clusters$cluster
# look at the first five records
teens[1:5, c("cluster", "gender", "age", "friends")]
# mean age by cluster
aggregate(data = teens, age ~ cluster, mean)
# proportion of females by cluster
aggregate(data = teens, female ~ cluster, mean)
# mean number of friends by cluster
aggregate(data = teens, friends ~ cluster, mean)
年龄、性别、朋友数量之间的关系表明,这些类是有用的预测因子,以这种方式来验证这些类的预测能力。
机器学习与R语言系列推文汇总:
手机扫一扫
移动阅读更方便
你可能感兴趣的文章