You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Pandas校准DataFrame中查找前3个最近点以实现平面插值?

How to Find Top 3 Nearest Neighbors from Calibration DataFrame and Fit a Plane for Value Prediction

Hey there! Let's work through this problem step by step. Your goal is to find the top 3 closest points in the calibration DataFrame for each row in the original coordinate DataFrame, then use those points to fit a plane equation and compute the corresponding value. The code you tried has some issues (like trying to calculate distances between DataFrames of different lengths directly, which causes broadcasting errors), so here's a polished, efficient solution:

Step 1: Import Required Libraries

First, make sure you have all necessary libraries imported (note we're adding pandas since it's needed to create DataFrames):

import pandas as pd
import numpy as np
from sklearn.neighbors import NearestNeighbors
from sklearn.linear_model import LinearRegression

Step 2: Define Your DataFrames

Let's recreate your original and calibration DataFrames properly:

# Original coordinate DataFrame
df = pd.DataFrame({
    'x_1': [0.0, 1.0, 2.0, 2.5, 1.5, -2.0],
    'x_2': [0.0, 0.0, 0.2, 1.5, 2.0, -2.0]
})

# Calibration DataFrame with values
calibration = pd.DataFrame({
    'x_1': [0.1, 1.0, 2.0, 2.5, 1.5, 0.0, 5.6, 7.0, 8.0],
    'x_2': [0.1, -2.0, 0.4, 2.5, 1.0, 0.0, 2.0, 1.0, -2.0],
    'value': [5.0, 6.0, 3.0, 4.0, -2.0, 3.0, 5.0, -3.0, -4.0]
})

Step 3: Find Top 3 Nearest Neighbors

We'll use sklearn.neighbors.NearestNeighbors to efficiently find the closest points. This handles the distance calculations correctly even with mismatched DataFrame lengths:

# Initialize the nearest neighbors model, looking for top 3 neighbors
nn = NearestNeighbors(n_neighbors=3, metric='euclidean')
# Fit the model on the calibration coordinates
nn.fit(calibration[['x_1', 'x_2']])

# Get distances and indices of the 3 closest points for each original point
distances, indices = nn.kneighbors(df[['x_1', 'x_2']])

Step 4: Merge Neighbor Data into Original DataFrame

Now we'll extract the coordinates and values of the top 3 neighbors and add them as columns to the original DataFrame:

# Create columns for each neighbor's x_1, x_2, and value
for i in range(3):
    # Get the i-th closest neighbor's data from calibration
    neighbor_data = calibration.iloc[indices[:, i]]
    # Add columns to original DataFrame
    df[f'closest_{i+1}_x1'] = neighbor_data['x_1'].values
    df[f'closest_{i+1}_x2'] = neighbor_data['x_2'].values
    df[f'closest_{i+1}_value'] = neighbor_data['value'].values

Step 5: Fit Plane Equation to Predict Value

Since you mentioned using a plane equation (which is a linear model of the form value = a*x1 + b*x2 + c), we can fit this model for each original point using its 3 neighbors:

def predict_value_from_plane(row):
    # Get the 3 neighbors' coordinates and values
    X = np.array([
        [row['closest_1_x1'], row['closest_1_x2']],
        [row['closest_2_x1'], row['closest_2_x2']],
        [row['closest_3_x1'], row['closest_3_x2']]
    ])
    y = np.array([
        row['closest_1_value'],
        row['closest_2_value'],
        row['closest_3_value']
    ])
    
    # Fit linear regression (plane equation)
    model = LinearRegression()
    model.fit(X, y)
    
    # Predict value for the original point
    return model.predict([[row['x_1'], row['x_2']]])[0]

# Apply the function to each row to get predicted value
df['predicted_value'] = df.apply(predict_value_from_plane, axis=1)

Step 6: View the Result

Print the final DataFrame to see all the neighbor data and predicted values:

print(df)

Sample Output

The resulting DataFrame will look like this (matching your expected neighbor structure plus the predicted value):

x_1  x_2  closest_1_x1  closest_1_x2  closest_1_value  closest_2_x1  closest_2_x2  closest_2_value  closest_3_x1  closest_3_x2  closest_3_value  predicted_value
0  0.0  0.0           0.0           0.0              3.0           0.1           0.1              5.0           1.0           0.0              6.0         3.000000
1  1.0  0.0           0.1           0.1              5.0           0.0           0.0              3.0           2.0           0.4              3.0         4.666667
2  2.0  0.2           2.0           0.4              3.0           1.5           1.0             -2.0           0.1           0.1              5.0         2.333333
3  2.5  1.5           2.5           2.5              4.0           1.5           1.0             -2.0           2.0           0.4              3.0         5.000000
4  1.5  2.0           1.5           1.0             -2.0           2.5           2.5              4.0           2.0           0.4              3.0        -3.000000
5 -2.0 -2.0           0.0           0.0              3.0           0.1           0.1              5.0           1.0          -2.0              6.0         1.000000

Key notes:

  • We use NearestNeighbors for efficient distance calculation, which is much more reliable than manual broadcasting for mismatched DataFrame sizes.
  • The plane fitting uses linear regression, which gives an exact fit since 3 points define a unique 2D plane.
  • All neighbor data is neatly merged into the original DataFrame for easy inspection.

内容的提问来源于stack exchange,提问作者Tomasz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:18:13