聚类分析
k-均值聚类:
1、随机选取k个样本作为类中心;
2、计算各样本与各类中心的距离;
3、将各样本归于最近的类中心点;
4、求各类的样本的均值,作为新的类中心;
5、判定:若类中心不再发生变动或达到迭代次数,算法结束,否则回到第2步。
代码:
k-中心点算法与k-均值算法在原理上十分相近,它是针对k-均值算法易受极值影响这一缺点的改进算法。在原理上的差异在于选择各类别中心点时不取样本均值点,而在类别内选取到其余样本距离之和最小的样本为中心。
层次聚类
层次聚类的名称在于,其聚类的过程可以通过类似于系谱图的形式呈现出来。相比k-均值算法与k-中心点算法,系谱算法的突出特点在于,不需要事先设定类别数k,这是因为它每次迭代过程叫仅将距离最近的两个样本/簇聚为一类,其运作过程将自然得到k=n至k=1(n为待分类样本总数)个类别的聚类结果。
k-均值聚类:
1、随机选取k个样本作为类中心;
2、计算各样本与各类中心的距离;
3、将各样本归于最近的类中心点;
4、求各类的样本的均值,作为新的类中心;
5、判定:若类中心不再发生变动或达到迭代次数,算法结束,否则回到第2步。
代码:
x <- 1:100 #生成数据点
y <- 50:149
plot(x,y)
center_1 <- c(x[1],y[1]) #初始化类中心
center_2 <- c(x[2],y[2])
n <- length(x) #统计样本个数
m <- 3
dis <- matrix(nrow = n,ncol = m)
sqrt((x[1]-center_1[1])^2+(y[1]-center_1[2])^2)
sqrt((x[1]-center_2[1])^2+(y[1]-center_2[2])^2)
while(TRUE){
for(i in 1:n){
dis[i,1] <- sqrt((x[i]-center_1[1])^2+(y[i]-center_1[2])^2)
dis[i,2] <- sqrt((x[i]-center_2[1])^2+(y[i]-center_2[2])^2)
}
for(i in 1:n){
dis[i,3] <- which.min(dis[i,1:2])
}
mean(x[dis[,3]==1])
mean(y[dis[,3]==1])
mean(x[dis[,3]==2])
mean(x[dis[,3]==2])
center_1_new <- c(mean(x[dis[,3]==1]),mean(y[dis[,3]==1]))
center_2_new <- c(mean(x[dis[,3]==2]),mean(y[dis[,3]==2]))
if(all(center_1==center_1_new) & all(center_2==center_2_new)){
break
}
center_1 <- center_1_new
center_2 <- center_2_new
}
k-中心点聚类
k-中心点算法与k-均值算法在原理上十分相近,它是针对k-均值算法易受极值影响这一缺点的改进算法。在原理上的差异在于选择各类别中心点时不取样本均值点,而在类别内选取到其余样本距离之和最小的样本为中心。
层次聚类
层次聚类的名称在于,其聚类的过程可以通过类似于系谱图的形式呈现出来。相比k-均值算法与k-中心点算法,系谱算法的突出特点在于,不需要事先设定类别数k,这是因为它每次迭代过程叫仅将距离最近的两个样本/簇聚为一类,其运作过程将自然得到k=n至k=1(n为待分类样本总数)个类别的聚类结果。