一、如何将数据离散化
1. 常用的离散化方法
常用的离散化方法有等宽法、等频法和(一维)聚类。
(1) 等宽法
该法将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用户指定,类似于制作频率分布表。
(2) 等频法
该法将相同数量的记录放进每个区间。
这两种方法简单,易于操作,但都需要人为地规定划分区间的个数。同时,等宽法的缺点在于它对离群点比较敏感,倾向于不均匀地把属性值分布到各个区间,有些区间包含许多数据,而另外一些区间的数据极少,这样会严重损坏建立的决策模型。等频法虽然避免了上述问题的产生,却可能将相同的数据值分到不同的区间以满足每个区间中固定的数据个数。
(3)(一维)聚类
(一维)聚类的方法包括两个步骤,首先将连续属性的值用聚类算法(如K-Means算法)进行聚类,然后再将聚类得到的簇进行处理,合并到一个簇的连续属性值并做同一标记。聚类分析的离散化方法也需要用户指定簇的个数,从而决定产生的区间数。
# 读取数据文件,提取标题行
data <- read.csv('./data/discretization_data.csv', header = TRUE)
# 等宽离散化
#ceiling返回对应数字的'天花板'值,就是不小于该数字的最小整数
#floor与ceiling相对,返回'地板'值,即不大于该数字的最大值
v1 <- ceiling(data[, 1] * 10)
head(data)
# 等频离散化
names(data) <- 'f' # 变量重命名
attach(data)
seq(0, length(f), length(f) / 6) # 等频划分为6组
v <- sort(f) # 按大小排序作为离散化依据
v2 <- rep(0, 930) # 定义新变量
for (i in 1:930) {
v2[i] <- ifelse (f[i] <= v[155], 1,
ifelse (f[i] <= v[310], 2,
ifelse (f[i] <= v[465], 3,
ifelse (f[i] <= v[620], 4,
ifelse (f[i] <= v[775], 5, 6)))))
}
detach(data)
# 聚类离散化
result <- kmeans(data, 6)
v3 <- result$cluster
# 图示结果
plot(data[, 1], v1, xlab = '等宽离散化')
plot(data[, 1], v2, xlab = '等频离散化')
plot(data[, 1], v3, xlab = '聚类离散化')