K-Means
初始中心:取前 k 个点作为初始中心(简单且可重复)。
迭代过程:
【问题背景】在无线网络优化中,基站的位置分布直接影响信号覆盖质量。密集区域的基站可能造成资源浪费,而稀疏区域则会出现信号覆盖不足。
【任务要求】给定n个基站的二维坐标,使用K-Means算法将其划分为k个簇,再通过计算每个簇的轮廓系数(Silhouette Coefficient),识别信号覆盖最差的簇(轮廓系数最低),并在该簇中心新增基站以优化信号覆盖。
【算法过程】
K-Means和轮廓系数的详细介绍见“提示”。
第一行:基站数量 n 和聚类簇数 k,之间以空格分开,其中 n 取值范围为 [1,500],k 取值范围为 [1,120]。
接下来 n 行:每行两个整数,表示基站的坐标 x 和 y,其中 x 取值范围为 [0,5000],y 取值范围为 [0,3000]。
新增基站的坐标:x,y (输出结果四舍五入保留两位小数,采用 RoundingMode.HALF_EVEN)
输入
6 2
0 0
1 1
2 2
10 10
11 11
5 5
输出
8.67,8.67
说明
簇划分结果:簇 0:[(0,0),(1,1),(2,2)],中心 (1,1); 簇 1:[(5,5),(10,10)(11,11)],中心 (8.67,8.67) 轮廓系数:簇 0 的轮廓系数: 0.82 ;簇 1 轮廓系数: 0.35 答案:输簇 1 的中心点: (8.67,8.67)
输入
4 2
0 0
0 1
1 0
10 10
输出
0.33,0.33
说明
簇划分结果:簇 0 : [(0,0),(0,1)(1,0)] ,中心点: (0.33,0.33) ; 簇 [(10.10)] ,中心点: (10,10)
轮廓系数:线 0 的轮廓系数: 0.92 ;簇 1 的轮廓系数: 1.0 答案:输出簇 0 的中心点: 0.33,0.33
簇 0:[A(0,0),B(0,1),C(1,0)] ;
簇 1 : [(10.10)]
簇 0 的轮廓系数计算:
计算点 A(0,0) :
1、A 同簇平均距离为 1 : A 到 B(0,1) 距离 1 ,A 到 C(1,0) 距离 1
2、A 到簇 1 平均距离为 14.142 : A 到 D(10,10) 距离 14.142
3、A 的轮廓系数 s(A):0.929
计算点 B(0,1) :
1、B 同簇平均距离为 1.207:B 到 A(0,0) 距离 1 ,B 到 C(1,0) 距离 1.414
2、B 到簇 1 平均距离为 13.454:B 到 D(10,10) 距离 13.454
3、B 的轮廓系数 s(B):0.910
计算点 C(1,0): 1、C 同簇平均距离为 1.207:C 到 A(0,0) 距离 1,C 到 B(0,1) 距离 1.414
2、C 到簇 1 平均距离为 13.454:C 到 D(10,10) 距离 13.454
3、C 的轮廓数 s(C):0.910
簇 0 轮廓系数: (s(A)+s(b)+s(b))/3=2.749/3=0.92
选择初始化的前 k 个样本作为初始聚类中心。
针对数据集中每个样本 xi,计算它到 k 个聚类中心的距离并将其分到距离最小的聚类中心所对应的类中。
针对每个类别 aj,重新计算它的聚类中心
aj=ci1x∈ci∑x(即属于该类的所有样本的质心)。
重复上面2、3两步操作,直到达到某个中止条件(迭代次数、最小误差变化等)。
1、对于一个数据点 i,先计算它和簇内其他数据点的平均距离 ai。
2、然后计算该点与不包含该点所在簇的其他簇内数据点的平均距离 bi(簇间相似度),选取其中距离最小的那个作为 i 的簇间平均距离。
3、最后,计算数据点 i 的轮廓系数:
si=max(ai,bi)bi−ai
将所有数据点的轮廓系数取平均值,即得到聚类算法的整体轮廓系数。
若某个数据点所在簇的数据点数量小于等于1,则该点的轮廓系数为 0。
1、Python默认的HALF_EVEN模式,其他语言按照如下规则处理: HALF_EVEN也称为“银行家舍入”或“向偶数舍入”。这种模式下,当小数部分恰好为0.5时,round()会将结果舍入到最近的偶数。