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

如何在Python中生成线性X-Y数据用于回归练习及特征-目标线性关联问题

如何让每个特征(自变量X)与目标变量Y都建立线性关系?

问题描述

当前生成的数据集里,10个特征仅1个与目标变量呈现线性关联,需要调整数据生成逻辑,让每个特征都和Y存在明显的线性关系。原代码用于测试SGD线性回归,但散点图显示多数特征和Y无线性相关性。

原代码的问题分析

  1. 噪声生成错误:原代码里的noise是单个标量,所有样本的y都加上同一个噪声值,这会导致噪声无法分散,反而可能掩盖特征的线性趋势。正确的做法是为每个样本生成独立的噪声。
  2. 真实系数可能接近0:用np.random.normal(loc=0, scale=1)生成的系数,大概率会有接近0的值,这类系数对应的特征对y的影响微乎其微,散点图自然看不到线性关系。
  3. 绘图使用外部变量:函数内的绘图逻辑引用了全局变量Xdata_in和y_data_in,而非函数内部生成的X和y,属于逻辑错误。
  4. 子图布局问题:当特征数为奇数时,round(num_features/2)会导致最后一行多一个空轴,影响可视化。

修改后的代码

import numpy as np
import matplotlib.pyplot as plt

# 固定随机种子保证复现性
np.random.seed(0)

def rand_X_y_LR(nsamples=None, nfeatures=None, plot_XY=False):
    num_samples = nsamples
    num_features = nfeatures

    # 生成[0,1]范围内的特征矩阵
    X = np.random.rand(num_samples, num_features)
    print(f"shape of random X; {X.shape}")
    
    # 添加截距项的全1列
    ones_column = np.ones((len(X), 1))
    X_plusOnes = np.hstack([ones_column, X])
    print(f"shape of X_plusOnes; {X_plusOnes.shape}")

    # 生成远离0的真实系数,确保每个特征对y都有明显影响
    # 这里用均匀分布生成2-5之间的系数,也可以用scale更大的正态分布,比如scale=3
    true_coefficients = np.random.uniform(low=2, high=5, size=(num_features+1))
    print(f"shape of true_coefficients; {true_coefficients.shape}")

    # 为每个样本生成独立的噪声
    noise = np.random.normal(loc=0, scale=1, size=num_samples)

    # 计算目标变量y
    y = X_plusOnes @ true_coefficients + noise
    print(f"y.shape; {y.shape}")

    if plot_XY:
        # 调整子图布局,避免空轴
        nrows = (num_features + 1) // 2
        fig, axes = plt.subplots(nrows=nrows, ncols=2, figsize=(12, 8))
        # 遍历每个特征绘图
        for i, ax in enumerate(axes.flat):
            if i >= num_features:
                # 隐藏多余的空轴
                ax.axis('off')
                continue
            ax.scatter(X[:, i], y, alpha=0.6, s=10)
            ax.set_xlabel(f"Feature {i}")
            ax.set_ylabel('Target Y')
            ax.set_title(f"Feature {i} vs Target Y")
        plt.tight_layout()
        plt.show()

        # 绘制Y的分布
        plt.figure(figsize=(5,4))
        plt.hist(y, bins=30, edgecolor='black')
        plt.title('Target Y Distribution')
        plt.show()

        # 绘制真实系数的分布
        plt.figure(figsize=(5,4))
        plt.hist(true_coefficients, bins=10, edgecolor='black')
        plt.title('True Coefficients Distribution')
        plt.show()

    return X, y, true_coefficients

# 生成1000样本、10特征的数据集
Xdata_in, y_data_in, true_beta = rand_X_y_LR(nsamples=1000, nfeatures=10, plot_XY=True)

修改说明

  • 噪声调整:将噪声改为和样本数一致的数组,每个样本的噪声独立,既符合线性回归的噪声假设,也不会掩盖特征的线性趋势。
  • 真实系数调整:使用均匀分布生成2-5之间的系数,确保每个特征对y的影响足够大,散点图能清晰呈现线性关系;也可以替换为np.random.normal(loc=3, scale=1, size=(num_features+1)),只要系数远离0即可。
  • 绘图逻辑修正:改用函数内部的X和y进行绘图,避免全局变量依赖;同时处理奇数特征数的空轴问题,让可视化更整洁。
  • 可视化优化:给散点图添加alpha=0.6和s=10,避免点重叠过于严重,让线性趋势更明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:24:58