问题遇到的现象和发生背景
计划通过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()
运行结果及报错内容
我的解答思路和尝试过的方法
如图所示,一共分为10个小区域,并且用不同颜色进行标注,希望可以计算每个不同颜色区域的面积,并结合每个区域内的样本数计算目标存在概率
我的解决方法:采用基于计算机图像获取每个小区域的轮廓,但是失败了
每个簇内样本点个数的获取已经实现,目前最大的问题就是计算每个区域的面积
我想要达到的结果
计算不同颜色的区域面积,并且对每个颜色的区域进行标号,将面积与区域进行一一对应,进而计算每个区域内目标存在概率