python - ValueError:matmul 尝试将 sklearn 的线性回归器拟合到 pandas 数据帧实例时
问题描述
我一直在尝试使用 sklearn 对一些虚拟数据执行简单的多元线性回归。我最初通过 sklearn.linear_model.LinearRegression.fit numpy 数组并不断收到此错误:
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 1)
我认为这是由于我的数组或其他东西的转置出现了一些错误,所以我拿出了一个使用熊猫数据框的教程并以相同的方式设置了我的代码:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
VWC = np.array((0,0.2,0.4,0.6,0.8,1))
Sensor_Voltage = np.array((515,330,275,250,245,240))
X = np.column_stack((VWC,VWC*VWC))
df = pd.DataFrame(X,columns=["VWC","VWC2"])
target = pd.DataFrame(Sensor_Voltage,columns=["Volt"])
model = LinearRegression()
model.fit(df,target["Volt"])
x = np.linspace(0,1,30)
y = model.predict(x[:,np.newaxis])
plt.plot(VWC, Sensor_Voltage)
plt.plot(x,y,dashes=(3,1))
plt.title("Simple Linear Regression")
plt.xlabel("Volumetric Water Content")
plt.ylabel("Sensor response (4.9mV)")
plt.show()
我仍然得到以下回溯:
Traceback (most recent call last):
File "C:\Users\Vivian Imbriotis\AppData\Local\Programs\Python\Python37\simple_linear_regression.py", line 16, in <module>
y = model.predict(x[:,np.newaxis])
File "C:\Users\Vivian Imbriotis\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\linear_model\_base.py", line 225, in predict
return self._decision_function(X)
File "C:\Users\Vivian Imbriotis\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\linear_model\_base.py", line 209, in _decision_function
dense_output=True) + self.intercept_
File "C:\Users\Vivian Imbriotis\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\utils\extmath.py", line 151, in safe_sparse_dot
ret = a @ b
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 1)
几个小时以来,我一直在努力解决这个问题,我只是不明白我做错了什么。
Scikit-learn、numpy、pandas都是最新版本;这是在 python 3.7.3 上
已解决:我很愚蠢并且误解了 np.newaxis 的工作原理。这里的目标是对数据进行二次拟合,所以我只需要更改:
x = np.linspace(0,1,30)
y = model.predict(x[:,np.newaxis])
至
x = np.columnstack([np.linspace(0,1,30),np.linspace(0,1,30)**2])
y = model.predict(x)
我相信有一种更优雅的方式来写,但是嗯。
解决方案
您使用 (6,2) 数据集的形状训练模型。如果您检查 df 的形状
df.shape = (6,2)
.
当您尝试预测时,您正在尝试使用不同形状的数据集。
x.shape=(30,1)
你需要的是使用正确的数据集形状。试试这个
x = np.linspace((0,0),(1,1),30)
y = model.predict(x)
推荐阅读
- apache-spark - Apache Spark Streaming 左外连接输出记录
- docker - 启动 docker 工具箱:无法在本地找到图像“图像:最新”
- c++ - integer_sequence 如何展开以生成序列?
- android - Android:清除堆栈后如何从最后一个活动恢复
- mysql - 如何使用键盘快捷键或菜单项在 MySQL Workbench 中注释掉代码?
- python - DataFrame 列的过滤和列表理解的结果不是我所期望的
- javascript - 使用 javascript 构建营业时间
- python - 如何在熊猫数据帧的每一行中获取特定值的频率
- java - NSEvent 中的断言失败?
- reactjs - PropTypes.symbol 的用例示例是什么?