我尝试在scikit-learn中运行一个简单的线性拟合:
from sklearn import linear_model
clf = linear_model.LinearRegression()
clf.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
结果是:
Illegal instruction (core dumped)
有谁知道这个问题的原因是什么以及如何解决这个问题吗?注:我使用scikit-learn的0.16.1
版本。但我在使用旧版本时也遇到了这个问题。我在Ubuntu下做。
今天我尝试了另一个估计器(KernelRidge
),我得到了同样的错误信息。我记得几个月前,我试着用scipy解一个线性方程组,我也犯了同样的错误。我需要补充的是,我尝试的例子总是很小(所以,问题的大小不应该是错误的原因)。在其他电脑上(在工作中)我也有Ubunutu和scikit-learn,我没有他们的这个问题。我的家用笔记本电脑好像出了点问题。
冒昧问一句,你的笔记本电脑有AMD的CPU吗?
AMD已经取消了对3DNow的支持!从Ubuntu和Debian的bug追踪器中可以发现,许多人都受到了(例如1,2,3,4,5)的攻击。
Scikit-learn建立在numpy之上,而numpy又使用OpenBLAS或Atlas等库在计算机的特定硬件上尽可能高效地执行计算。
然而,为Debian和Ubuntu编译的默认版本针对较旧的cpu,基于未来的处理器能够执行较旧处理器的代码,但这通常不是正确的。
在这种情况下,然而,较新的AMD cpu已经删除了指令,所以你收到一个Illegal instruction
错误,尽管有有效的python代码,因为底层库正在尝试使用不再存在的旧指令。
如果这是发生的事情,那么修复是为您的笔记本电脑的实际处理器构建numpy和OpenBLAS,而不是由Debian提供的通用处理器。虽然这个例子是针对Ubuntu的,但https://hunseblog.wordpress.com/2014/09/15/installing-numpy-and-openblas/给出的说明应该可以很好地用于Debian。
您需要卸载它,手动删除文件夹,因为卸载不能正常清理。在我的例子中,我卸载了scikit-learn-0.17.1并安装了scikit-learn-0.18.1
pip uninstall scikit-learn
rm -rf ~/venv/lib/python2.7/site-packages/sklearn/
pip uninstall scikit-learn
这是"python-scikits-learn"包的所有依赖项列表:
- python-scikits.statsmodels
- python-skimage
- python-skimage-doc
- python-skimage-lib
- python-sklearn
- python-sklearn-doc
- python-sklearn-lib
如果所有的依赖项都满足了,但你的程序仍然不能工作,你应该卸载这些二进制文件并从源代码安装,手动安装将检测到你系统的正确设置。
您也可以尝试重新安装软件包:
sudo apt-get autoremove python-scikits-learn
sudo apt-get install python-scikits-learn