Непреднамеренное преобразование dtype приводит к некастабельному массиву - PullRequest
0 голосов
/ 28 января 2019

Один из моих методов класса, по-видимому, преобразует тип данных из 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)

дает результат, который я искал.

1 Ответ

0 голосов
/ 28 января 2019

Ну, не очень понятно, является ли ваша выборка каждой строкой таблицы, но сейчас она просто перебирает столбцы вместо любого действительного числа.Таким образом, я смог заставить код работать, сделав это.Исправление лежит внутри цикла for внутри функции learn():

import numpy as np
import pandas as pd


class Perzeptron(object):
    def __init__(self, n):
        """n is the number of weights that are needed."""
        self.weights = np.array([np.random.uniform(-1, 1) for f in range(n)])
        self.bias = np.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.iterrows():
            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)
print(learning_data)
x = Perzeptron(2)
x.learn(learning_data.loc[:, '1':'3'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...