我刚开始使用Python学习机器学习。我编写了以下类,它给出了一个错误:
TypeError:不能将序列乘以非int类型' float'
class Perceptron(object):
def __init__(self, eta=0.01, n_iter=10):
self.eta = eta # Learning Rate
self.n_iter = n_iter # Number of iteration over the training dataset
def fit(self, x, y):
self.w_ = np.zeros(1 + x.shape[1]) # Initialize Weights to zero initially # x = {array-like} : shape[no_of_samples, no_of_features]
self.errors_ = [] # No errors in the beginning of the computation
for _ in range(self.n_iter):
errors = 0
for xi, target in zip(x, y):
update = self.eta * (target - self.predict(xi))
self.w_[1:] += update * xi
self.w_[0] += update
errors += int(update != 0.0)
self.errors_.append(errors)
return self
def net_input(self, x):
return np.dot(x, self.w_[1:]) + self.w_[0]
def predict(self, x):
return np.where(self.net_input(x) >= 0.0, 1, -1)
我在np.dot()的net_input()方法中遇到错误。 我使用以下数据集: https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv
答案 0 :(得分:0)
以下更改会有所帮助。
String
答案 1 :(得分:0)
检查shape
的{{1}}。
如果x
(a, 1)
是一个数字,请使用:
a
如果是def net_input(self, x):
return np.dot(x.T, self.w_[1:]) + self.w_[0]
,请使用:
(1, a)
答案 2 :(得分:0)
我的猜测是x
是一个对象dtype列表数组。
如果我定义一个对象dtype数组:
In [45]: x=np.empty((2,),object)
In [46]: x[:]=[[1,2],[3,4]]
In [49]: x
Out[49]: array([list([1, 2]), list([3, 4])], dtype=object)
我在浮点数列表(或数组)中得到了同样的错误:
In [50]: np.dot(x, [1.2,4.5])
...
TypeError: can't multiply sequence by non-int of type 'float'
如果我给它整数,它可以工作 - 有点
In [51]: np.dot(x, [1,2])
Out[51]: [1, 2, 3, 4, 3, 4]
它实际完成的是[1,2]*1
和[3,4]*2
,列出复制。这不是数字乘法。
这是唯一能够理解错误信息的变量组合。
所以你需要弄清楚为什么x
是一个对象数组。通常,这是从长度不同的列表构建数组的结果
In [54]: x = np.array([[1,2],[3,4,5]])
In [55]: x
Out[55]: array([list([1, 2]), list([3, 4, 5])], dtype=object)
所以当面对这样的错误时,基本问题是变量的shape
和dtype
是什么。
答案 3 :(得分:0)
如果您正在从文件iris.csv中读取训练数据(数据和预测)
sepal_length,sepal_width,petal_length,petal_width,species
5.1,3.5,1.4,0.2,setosa
4.9,3,1.4,0.2,setosa
具有:
data = pd.read_csv("iris.csv")
确保将x
定义为前四列,否则它将包含最后一列中的字符串:
X = data.iloc[:,0:4]
预测值:
y = data.iloc[:,5]
y = y.values.reshape(150,1)