python计算决策区域伪彩图面积

问题遇到的现象和发生背景

计划通过kmeans算法将大的区域进行划分,并计算每个小区域中目标存在概率

用代码块功能插入代码,请勿粘贴截图
from sklearn.cluster import KMeans
import math
import numpy as np
import matplotlib.pyplot as plt
import numpy.random as rd
import pandas as pd
from matplotlib.colors import ListedColormap

rdata = rd.randint(1, 100, size=(20, 2), dtype=int)
dataSet = np.array(rdata)
x = dataSet[:, 0]
y = dataSet[:, 1]

# 使用特征值来绘制决策边界,先获取特征的最大值与最小值
# 获取边界范围
# +n -n的操作可以理解为防止样本落在图的边缘处
x_min, x_max = x.min() - 3, x.max() + 3
y_min, y_max = y.min() - 3, y.max() + 3

# 在指定的大间隔内,返回固定间隔的数据
tx = np.linspace(x_min, x_max)
ty = np.linspace(y_min, y_max)

# 通过获取的x和y的值来生成要绘制的每一个点的坐标
xx = np.arange(x_min, x_max)
yy = np.arange(y_min, y_max)
# 生成网格点坐标矩阵
grid_x = np.meshgrid(xx, yy)

# 聚类算法
model = KMeans(n_clusters=10, init='k-means++')
KM = model.fit_predict(dataSet)
# 聚类中心计算
center = pd.DataFrame(model.cluster_centers_)
# 聚类中心转化为数组
c = np.array(center)

# 统计每个簇中样本个数
l = np.zeros((10, 1))
for i in range(0, len(KM)):
    if KM[i] == 0:
        l[0] += 1
    elif KM[i] == 1:
        l[1] += 1
    elif KM[i] == 2:
        l[2] += 1
    elif KM[i] == 3:
        l[3] += 1
    elif KM[i] == 4:
        l[4] += 1
    elif KM[i] == 5:
        l[5] += 1
    elif KM[i] == 6:
        l[6] += 1
    elif KM[i] == 7:
        l[7] += 1
    elif KM[i] == 8:
        l[8] += 1
    elif KM[i] == 9:
        l[9] += 1

# 需要把所有的颜色值变为与形状相符的矩形形状,即每个决策边界所在位置坐标的集合
flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()]
flat_y = model.predict(flat_x)
grid_y = flat_y.reshape(grid_x[1].shape)

# 创建一个带有不规则矩形网格的伪彩色图
plt.pcolormesh(grid_x[0], grid_x[1], grid_y, alpha=0.3, cmap='Paired')

plt.scatter(x, y, c=y, s=30, edgecolors='#FFFFFF', zorder=1)
# 聚类中心绘制
plt.scatter(center[0], center[1], cmap=ListedColormap('#FFFFFF'), marker='X')
# 将每一个聚类中心视为每个区域的中心点,从而计算两个区域之间的距离

# 画布
plt.title('area')
plt.xlabel('X')
plt.ylabel('Y')

plt.show()


运行结果及报错内容

img

我的解答思路和尝试过的方法

如图所示,一共分为10个小区域,并且用不同颜色进行标注,希望可以计算每个不同颜色区域的面积,并结合每个区域内的样本数计算目标存在概率
我的解决方法:采用基于计算机图像获取每个小区域的轮廓,但是失败了
每个簇内样本点个数的获取已经实现,目前最大的问题就是计算每个区域的面积

我想要达到的结果

计算不同颜色的区域面积,并且对每个颜色的区域进行标号,将面积与区域进行一一对应,进而计算每个区域内目标存在概率

由于我的产生的结果类似于Voronoi图,因此我借助了Voronoi图的思想解决了该问题