python - 为什么这条线性回归线不是直线?

标签 python scikit-learn linear-regression

我有一些带有 x 和 y 坐标的点,我想用线性回归拟合一条直线,但我得到了一条锯齿状的线。

我正在尝试使用 sklearn 中的 LinearRegression。

要创建点,请运行一个 for 循环,随机将一百个点放入形状为 100 x 2 的数组中。我将其左侧切片为 xs,将右侧切片为 ys。

我希望在打印 m.predict 时得到一条直线。

import numpy as np
import matplotlib.pyplot as plt
import random
from sklearn.linear_model import LinearRegression

X = []
adder = 0
for z in range(100):
    r = random.random() * 20
    r2 = random.random() * 15
    X.append([r+adder-0.4, r2+adder])
    adder += 0.6
X = np.array(X)

plt.scatter(X[:,0], X[:,1], s=10)
plt.show()

enter image description here

m = LinearRegression()
m.fit(X[:,0].reshape(1, -1), X[:,1].reshape(1, -1))

plt.plot(m.predict(X[:,0].reshape(1, -1))[0])

enter image description here

最佳答案

我不擅长numpy,但是,我认为这是因为使用reshape()函数来转换X[:,0]X [:,1] 从 1D 到 2D,生成的 2D 数组只包含一个元素,而不是创建 len(X[:,0]) 的 2D 数组len(X[:,1]) 分别。并导致不期望的回归量。
我能够使用 pandas 重新创建此模型并能够绘制所需的结果。代码如下

import numpy as np
import matplotlib.pyplot as plt
import random
from sklearn.linear_model import LinearRegression
import pandas as pd
X = []
adder = 0
for z in range(100):
    r = random.random() * 20
    r2 = random.random() * 15
    X.append([r+adder-0.4, r2+adder])
    adder += 0.6
X = np.array(X)

y_train = pd.DataFrame(X[:,1],columns=['y'])
X_train = pd.DataFrame(X[:,0],columns=['X'])

//plt.scatter(X_train, y_train, s=10)
//plt.show()

m = LinearRegression()
m.fit(X_train, y_train)
plt.scatter(X_train,y_train)
plt.plot(X_train,m.predict(X_train),color='red')

enter image description here

关于python - 为什么这条线性回归线不是直线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72205186/

相关文章:

opencv - opencv中有求解xA=b的函数吗?

r - R中的回归-4个要素,400万个实例

python - Twitter API - 如何获取 OAUTH_FILE?

python - 如何从多索引数据框中删除索引列

python - 在元组列表的每个元组的末尾添加列表的元素

pandas - 通过排除某些词汇更快地加载 fasttext 模型

python - 摘要不适用于 OLS 估计

python - 如何使用 pyOpenSSL 生成证书以使其安全连接?

python - 将特征名称更新为 scikit TFIdfVectorizer

python - 让 OneHotEncoder 管理转换步骤中看不见的值