Ошибка при расчете параметров (неподдерживаемый тип операнда) - PullRequest
2 голосов
/ 30 июня 2019

Я пытаюсь вычислить линейную регрессию для моего небольшого проекта по науке о данных.

У меня есть класс

import numpy as np

# I'm using the idea from https://devarea.com/linear-regression-with-numpy/#.XRfdcegzaUk
class LinearRegression:
    def __init__(self, values):
        self.y = np.array(values)
        self.x = np.array([number for number in range(1, len(values)+1)])
        self.values_to_return = []

    def getlinear(self, x1):
        # Function that returns value
        def inner(x1):
            return self.m * x1 + self.b

        self.m = (len(self.x) * np.sum(self.x*self.y) - np.sum(self.x) * np.sum(self.y)) / (len(self.x)*np.sum(self.x*self.x) - np.sum(self.x) * np.sum(self.x))
        self.b = (np.sum(self.y) - self.m*np.sum(self.x)) / len(self.x)

        return inner

И я получил ошибку

Файл "c: / Users / Paweł / Documents / projects vscode / WorldBankDataKeras / tests.py", строка 35, в country1 = data.CountryInformations ('Польша') Файл "c: \ Users \ Paweł \ Documents \ projects vscode \ WorldBankDataKeras \ data.py", строка 26, в init linear.return_values_of_linear_regression ()) Файл "c: \ Users \ Paweł \ Documents \ projects vscode \ WorldBankDataKeras \ linear_regr.py", строка 22, в return_values_of_linear_regression self.values_to_return.append (self.getlinear (x_param)) Файл "c: \ Users \ Paweł \ Documents \ projects vscode \ WorldBankDataKeras \ linear_regr.py", строка 15, в getlinear self.m = (np.array (len (self.x)) * np.sum (self.x * self.y) - np.sum (self.x) * np.sum (self.y)) / ( np.array (len (self.x)) np.sum (self.x self.x) - np.sum (self.x) * np.sum (self.x)) Ошибка типа: неподдерживаемые типы операндов для *: 'int' и 'dict_values'

Что я делаю не так?

EDIT:

При передаче списка (dictionary.values ​​()) в класс я получил

Traceback (последний вызов был последним): Файл "c: / Users / Paweł / Documents / projects vscode / WorldBankDataKeras / tests.py", строка 41, в graph.plot_graph_renewable_electricity_status () Файл "c: \ Users \ Paweł \ Documents \ projects vscode \ WorldBankDataKeras \ graph_plotting.py", строка 115, в plot_graph_renewable_electricity_status LineStyle = '-') Файл "C: \ Users \ Paweł \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ matplotlib__init __. Py", строка 1810, во внутренней return func (ax, * args, ** kwargs) Файл "C: \ Users \ Paweł \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ matplotlib \ axes_axes.py", строка 1612, в сюжете self.add_line (линия) Файл "C: \ Users \ Paweł \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ matplotlib \ axes_base.py", строка 1895, в add_line self._update_line_limits (линия) Файл "C: \ Users \ Paweł \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ matplotlib \ axes_base.py", строка 1917, в _update_line_limits путь = line.get_path () Файл "C: \ Users \ Paweł \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ matplotlib \ lines.py", строка 945, в get_path self.recache () Файл "C: \ Users \ Paweł \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ matplotlib \ lines.py", строка 645, в режиме восстановления y = _to_unmasked_float_array (yconv) .ravel () Файл "C: \ Users \ Paweł \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ matplotlib \ cbook__init __. Py", строка 1365, в _to_unmasked_float_array вернуть np.asarray (x, float) Файл "C: \ Users \ Paweł \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ numpy \ core \ numeric.py", строка 538, в asarray возвращаемый массив (a, dtype, copy = False, order = order) TypeError: аргумент float () должен быть строкой или числом, а не 'функцией'

РЕДАКТИРОВАТЬ 2:

class CountryInformations:

    def __init__(self, name):
        self.name = name

        xls_parsing = xls_parse.XLSParsing(self.name)

        self.population = xls_parsing.import_country_population()
        self.co2_emissions = xls_parsing.import_country_co2_emissions()
        self.renewable_electricity_status = xls_parsing.import_country_renewable_electricity_status()

        # I want to have linear regression values in format [year] : value
        self.population_linear_regression = self.population.copy()
        self.co2_emissions_linear_regression = self.co2_emissions.copy()
        self.renewable_electricity_status_linear_regression = self.renewable_electricity_status.copy()

        linear = linear_regr.LinearRegression(list(self.population_linear_regression.values()))
        # Replacing values in dict by values from linear regression
        self.population_linear_regression = dict.fromkeys(self.population_linear_regression,
                                                          linear.return_values_of_linear_regression())

        linear = linear_regr.LinearRegression(list(self.co2_emissions_linear_regression.values()))
        # Replacing values in dict by values from linear regression
        self.co2_emissions_linear_regression = dict.fromkeys(self.co2_emissions_linear_regression,
                                                             linear.return_values_of_linear_regression())

        linear = linear_regr.LinearRegression(list(self.renewable_electricity_status_linear_regression.values()))
        # Replacing values in dict by values from linear regression
        self.renewable_electricity_status_linear_regression = dict.fromkeys(self.renewable_electricity_status_linear_regression, 
                                                                            linear.return_values_of_linear_regression())

    def __str__(self):
        print_string = 'Country: {} \n \
                        Population: {}M \n \
                        CO2 Emissions: {}KT \n \
                        Renewable Electricity Status: {}%'.format(self.name, \
                                                                  self.population, \
                                                                  self.co2_emissions, \
                                                                  self.renewable_electricity_status)
        return print_string

1 Ответ

0 голосов
/ 30 июня 2019

Я решил это, удалив внутреннюю функцию.Я не знаю, почему это работает, так и делает

def getlinear(self, x1):

    self.m = (len(self.x) * np.sum(self.x*self.y) - np.sum(self.x) * np.sum(self.y)) / (len(self.x)*np.sum(self.x*self.x) - np.sum(self.x) * np.sum(self.x))
    self.b = (np.sum(self.y) - self.m*np.sum(self.x)) / len(self.x)

    return self.m * x1 + self.b

Спасибо за помощь всем

...