繁体   English   中英

matplotlib绘图后的Sklearn回归拟合错误

[英]Sklearn Regression Fit error after matplotlib plotting

解决了

问题似乎是 Anaconda 安装的软件包和全局安装的 pip 软件包(我安装了 Python 3.8 独立版)之间的冲突。 我不是 100% 冲突的根源究竟是什么,但是在卸载 Python 3.8 和 Anaconda(然后使用我需要的所有软件包重新安装 Anaconda)之后, ValueError不再发生。 这让我相信,当我使用 pip 安装一个包(意外地全局安装)时,sklearn 或其依赖项是通过 pip 全局安装的,并且该包与导致ValueError的 Anaconda 版本冲突。


我在 Python 中创建了一个回归图,使用 sklearn 拟合数据,然后在 JupyterLab 中使用 matplotlib 进行绘图。 问题是我会得到一个ValueError: illegal value in 4-th argument of internal None每隔一次单元格运行。

因此,如果我第一次运行单元格,一切都按预期工作,那么第二次运行它时会出现该错误(最后是完整错误,代码下方)。 请注意,这仅在数据(x 数组和 y 数组)的长度为 9 或更长(长度为 8 或更少不会导致任何错误,无论多少次单元格运行)。

理想情况下,我希望通过向我的代码添加一些内容或者如果我需要更新/降级软件包来修复他的问题。 下面我按以下顺序列出了我的代码单元格、错误消息、软件包版本(与 anaconda 一起安装)以及我尝试过但没有奏效的解决方案。

注意:如果我重新运行单元格或运行另一个基本相同但输入不同的单元格(x 和 y),则 ValueError 仅每隔一次运行(因此第一次运行正常运行)才会发生,ValueError 将发生。

1)

import matplotlib.pyplot as plt
import numpy as np

from sklearn.linear_model import LinearRegression

data_length = 9  # ValueErrors occur at 9 or greater (8 or less doesn't produce any errors)

x = np.random.rand(data_length)
x_train = x[:, np.newaxis]

y = np.random.rand(data_length)

model = LinearRegression().fit(x_train, y)

plt.figure(figsize=(8, 6))
plt.title('Example Regression that Produces a ValueError Every Other Run')

plt.yticks(fontsize=14)
plt.xticks(fontsize=14)

plt.xlabel('M03A 28% SVR Activity (%)', fontsize=14)
plt.ylabel('Reference Activity (%)', fontsize=14)

ax = plt.gca()

color=next(ax._get_lines.prop_cycler)['color']

plt.plot(x, model.predict(x[:, np.newaxis]), label='Line of Best Fit', color=color)

plt.text(
    .05,
    .5,
    'y = {}x {} {}\n$R^2$ = {}'.format(
        round(model.coef_[0], 2), '-' if model.intercept_ < 0 else '+', abs(round(model.intercept_, 2)), round(model.score(x_train, y), 2)),
    bbox=dict(facecolor='white', edgecolor=color),
    color=color,
    transform=ax.transAxes,
)

color=next(ax._get_lines.prop_cycler)['color']

plt.plot(x, y, 'o', color=color, label='Data')

plt.xlim(0, np.max(x)*1.1)
plt.ylim(0, np.max(y)*1.1)

plt.legend()
plt.show()  # removing this makes no difference
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-40-c3d4bd1a69a4> in <module>
      6 y = np.random.rand(data_length)
      7 
----> 8 model = LinearRegression().fit(x_train, y)
      9 
     10 plt.figure(figsize=(8, 6))

~\Anaconda3\lib\site-packages\sklearn\linear_model\_base.py in fit(self, X, y, sample_weight)
    545         else:
    546             self.coef_, self._residues, self.rank_, self.singular_ = \
--> 547                 linalg.lstsq(X, y)
    548             self.coef_ = self.coef_.T
    549 

~\AppData\Roaming\Python\Python38\site-packages\scipy\linalg\basic.py in lstsq(a, b, cond, overwrite_a, overwrite_b, check_finite, lapack_driver)
   1223             raise LinAlgError("SVD did not converge in Linear Least Squares")
   1224         if info < 0:
-> 1225             raise ValueError('illegal value in %d-th argument of internal %s'
   1226                              % (-info, lapack_driver))
   1227         resids = np.asarray([], dtype=x.dtype)

ValueError: illegal value in 4-th argument of internal None
​```
matplotlib -> 3.3.1
numpy -> 1.19.1
scikit-learn -> 0.23.2
scipy -> 1.5.0

在另一个 stackoverflow 页面上,其中一条评论提到了scipy安装损坏的scipy ,我尝试用scipy强制重新安装它,但没有任何效果。

另一个(在同一页面上)提到了plt.show()但是在代码单元中包含或排除它对错误的发生没有影响。

我有完全相同的经验(使用 PyCharm 而没有 Anaconda) - 再次运行违规行,它起作用了!!


----> 1 lm.fit(X_train,y_train) 中的 LinAlgError 回溯(最近一次调用)

~\\pycharmprojects\\jupyternotebooks\\venv\\lib\\site-packages\\sklearn\\linear_model_base.py in fit(self, X, y, sample_weight) 545 else: 546 self.coef_, self. 残基,self.rank ,self.singular_ =
--> 547 linalg.lstsq(X, y) 548 self.coef_ = self.coef_.T 549

~\\pycharmprojects\\jupyternotebooks\\venv\\lib\\site-packages\\scipy\\linalg\\basic.py in lstsq(a, b, cond, overwrite_a, overwrite_b, check_finite, lapack_driver) 1219 cond, False, False) 1220 if info > 0 :-> 1221 raise LinAlgError("SVD 没有收敛于线性最小二乘法") 1222 if info < 0: 1223 raise ValueError('内部 %s 的第 %d 个参数中的非法值'

LinAlgError:SVD 在线性最小二乘法中没有收敛

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM