You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

双空间数据集下基于真实数据二元标签的模拟数据概率赋值方案咨询

双空间数据集下基于真实数据二元标签的模拟数据概率赋值方案咨询

嗨,针对你提出的给模拟数据点赋予「真实数据标签为1的概率」这个需求,我来分享几个实用的思路,结合你的示例代码和可视化场景来拆解:

首先,你的问题本质是空间二元概率预测任务:用带0/1二元标签的小样本真实空间数据,为范围更广的无标签模拟空间数据,预测其属于类别1(绿色点)的概率。你提到的最近邻是非常直观的选择,不过还有不少更适合空间数据的方法,下面逐一说明:


一、入门首选:k近邻(k-NN)系列

你想到的单最近邻可以扩展为更合理的k近邻方法:

  • 基础k-NN:对每个模拟点,找周围k个最近的真实数据点,用其中类别1的占比作为概率(比如k=5,3个绿点则概率为0.6)
  • 加权k-NN:给距离更近的真实点更高权重,比如用距离的倒数加权,这样近的点对概率的影响更大,更符合空间局部相关性

我在你的示例代码基础上,加入了加权k-NN的概率预测实现,还做了可视化优化:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle
from sklearn.neighbors import KNeighborsClassifier

# 生成真实数据(和你的代码逻辑一致)
real_data = pd.DataFrame(np.random.randint(0,100,size=(100, 2)), columns=['x1','y1'])
outcome = cycle([0,1])
real_data['Outcome'] = [next(outcome) for _ in range(len(real_data))]
colors = np.where(real_data["Outcome"]==1,'green','red')

# 生成模拟数据(和你的代码逻辑一致)
model_data = pd.DataFrame(np.random.randint(-25,125,size=(1000, 2)), columns=['x2','y2'])

# 用加权k-NN训练并预测概率
knn = KNeighborsClassifier(n_neighbors=7, weights='distance')  # k值可根据数据分布调整
knn.fit(real_data[['x1','y1']], real_data['Outcome'])
# 提取每个模拟点属于类别1的概率
model_data['Prob_Outcome_1'] = knn.predict_proba(model_data[['x2','y2']])[:, 1]

# 可视化:模拟点颜色随概率从红(0)到绿(1)渐变
fig, ax = plt.subplots(figsize=(10,8))
# 模拟点用渐变颜色展示概率分布
scatter_model = ax.scatter(model_data['x2'], model_data['y2'], 
                           c=model_data['Prob_Outcome_1'], cmap='RdYlGn', 
                           alpha=0.6, zorder=-1)
# 真实点用红/绿标注,突出参考
ax.scatter(real_data['x1'], real_data['y1'], color=colors, s=100, zorder=0)
# 添加颜色条解释概率含义
plt.colorbar(scatter_model, label='Probability of being Outcome=1')
plt.xlabel('X Coordinate')
plt.ylabel('Y Coordinate')
plt.show()

二、进阶方法:适配不同空间场景

1. 核密度估计(KDE)

分别对真实数据中类别1和类别0的点计算空间核密度,再用贝叶斯公式推导概率:
$$P(1|x) = \frac{f_1(x)}{f_1(x) + f_0(x)}$$
其中$f_1(x)$是类别1点在x处的核密度,$f_0(x)$是类别0的核密度。这种方法能生成平滑的概率分布,适合真实数据有连续空间聚类趋势的情况,用scipy.stats.gaussian_kde就能快速实现。

2. 空间克里金插值

把类别1的标签看作空间上的“点属性”,用克里金插值(比如普通克里金)对整个空间做插值,得到每个模拟点的概率值。这种方法专门针对强空间自相关的数据,在地理、环境领域应用广泛,pykrige库提供了成熟的实现工具。

3. 机器学习分类模型

如果想捕捉更复杂的空间非线性关系,可以尝试:

  • 逻辑回归:手动加入空间特征(比如到最近类别1/0点的距离、局部点密度)
  • 树模型(随机森林、XGBoost):直接用x/y坐标作为输入,模型会自动学习空间模式,输出概率值,你的100个真实样本完全足够训练这类模型

结合你的可视化场景参考

从你提供的空间分布图来看:
真实数据与模拟数据的空间分布
模拟数据的覆盖范围比真实数据更广(-25到125 vs 0到100),在真实数据范围外的区域,k-NN或KDE的外推能力会受限,这时候可以考虑加入空间边界约束,或者用带空间正则化的模型来优化外推效果。

备注:内容来源于stack exchange,提问作者jonboy

火山引擎 最新活动