Один из моих методов класса, по-видимому, преобразует тип данных из float64 в строку.
def transfer(self, sample):
"""Takes a list, tupel or arry as input."""
c = self.bias + np.dot(sample[:-1], self.weights)
return c
Если эта функция вызывается вручную с помощью входных данных:
sample = learning_data.loc[0, "1":"3"]
1 -0.383362
2 -0.487992
3 0.000000
Name: 0, dtype: float64
x.transfer(sample)
Я получаю правильныйрезультат.Но если функция вызывается из:
def learn(self, vector):
for sample in vector:
y = self.activator(self.transfer(sample))
if y != sample[-1]:
w = self.update_weigts(y, sample)
b = self.update_bias(y, sample)
else:
pass
С:
vector = learing_data.loc[: ,"1":"3"]
0 1 2 3
565 1 -0.761398 -1.060793 0
670 1 1.861826 1.822200 0
72 1 1.440886 1.718266 0
898 1 -2.472685 -1.699168 0
1773 1 1.075351 4.293892 1
Я получаю следующую ошибку:
--> y = self.activator(self.transfer(sample))
TypeError: Cannot cast array data from dtype('float64') to dtype('<U32')
according to the rule 'safe'
Сначала я проверил, что '
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1400 entries, 565 to 1515
Data columns (total 4 columns):
0 1400 non-null int64
1 1400 non-null float64
2 1400 non-null float64
3 1400 non-null int64
dtypes: float64(2), int64(2)
memory usage: 94.7 KB
Там нет типа перемешивания, и функция get называется так:
x.learn(learning_data.loc[:, '1':'3'])
Таким образом, нет никаких предварительных манипуляций с типом данных для функции передачи.Единственное, что делается с данными, это цикл for в функции обучения.
Чего мне не хватает?
Минимальный код для воспроизведения ошибки:
import numpy as np
import pandas as pd
import random
class Perzeptron(object):
def __init__(self, n):
"""n is the number of weights that are needed."""
self.weights = np.array([random.uniform(-1, 1) for f in range(n)])
self.bias = random.uniform(-1, 1)
self.rate = 1
def transfer(self, sample):
c = self.bias + np.dot(sample[:-1], self.weights)
return c
def activator(self, c):
if c > 0:
return 1
else:
return 0
def learn(self, vector):
for sample in vector:
y = self.activator(self.transfer(sample))
if y != sample[-1]:
w = 1 # call to jet another function
b = 2 # call to jet another function
else:
pass
v = {'0': {565: 1, 670: 1, 72: 1, 898: 1, 1773: 1},
'1': {565: -0.761397898, 670: 1.8618260619999998, 72: 1.4408856630000002,
898: -2.472684622, 1773: 1.0753508809999999},
'2': {565: -1.060793281, 670: 1.8221998209999999, 72: 1.7182657719999999,
898: -1.699168086, 1773: 4.293891907},
'3': {565: 0, 670: 0, 72: 0, 898: 0, 1773: 1}}
learning_data = pd.Dataframe(v)
x = Perzeptron(2)
x.learn(learning_data.loc[:, '1':'3'])
РЕДАКТИРОВАТЬ:
Проблема была в том, что sample
не было той формы, которую я ожидал.Удаление столбца 0 в Dataframe и использование
x.learn(learning_data.values)
дает результат, который я искал.