错误:float()参数必须是字符串或数字,而不是'dict_keys'

时间:2019-09-27 13:27:10

标签: python numpy scikit-learn

您好,在运行此代码时,我总是收到错误“错误:float()参数必须是字符串或数字,而不是'dict_keys'”。我以为我以前没有任何问题就运行过它,但是现在看来它不再起作用了。那可能吗?如果是这样,我该怎么做才能使其重新工作?我的问题是在最后一部分中,我想绘制执行计算所需的时间。但是我想也许是较早的变量之一没有正确定义还是什么?感谢您的帮助! 谢谢!

from sklearn.linear_model import LinearRegression
import numpy as np
from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt #biblioteca de gráficos a partir de listas o arreglos 
import time
import threading #para hacer subprocesos 
import gc #gc.collect va borrando lo de la memoria

#Definicion de filas y columnas (Parte de arriba)

np.random.seed(42)
n_rows = 100 #número fijo de filas
cols_min = 100  #comienzo numero de columnas
cols_max = 12_800 #máximo de columnas para que salga del loop
timeout = 90 # segundos maximos para correr la iteracion, se puede ir modificando para testeo

#Generaremos funciones para ir llamando
def mult_range(start, end): #Finalidad es que irá duplicando las columnas
    val = start
    while val <= end:
        yield val
        val *= 2

#gen_dataset irá generando un conjunto de datos, partiendo de 100 columnas que son las fijadas en la parte de arriba
#la gracia es tener por separado x e y para luego hacer en una linea los gráficos

def gen_dataset(n_rows, n_cols):
    y = np.random.rand(n_rows)   #crea la matriz y la rellena con el valor de n_rows // las n filas
    x = np.random.rand(n_rows, n_cols) #para la matriz n filas m columnas 
    return x, y


#cromometrará el tiempo de cálculo
def timeit(timeout, n_cols, result, fn, *args, **kwargs):
    try:# función que puede llegar a levantar una excepción 
        #link: para info https://uniwebsidad.com/libros/algoritmos-python/capitulo-12/excepciones
        t1 = datetime.now() #valor actual
        fn(*args, **kwargs)
        t2 = datetime.now() #valor nuevo
        delta = t2 - t1 #diferencia
        delta_microsecs = delta.seconds * 1_000_000 + delta.microseconds #tiempo que tardará la ejecución
        if (delta_microsecs / 1_000_000) < (timeout + 500_000): #condición para que imprima lo que tarda
            #irá imprimiendo instantaneamente en la pantalla para saber el tiempo que tarda por cantidad
            print(f"for {n_cols} columns it took {delta_microsecs / 1_000_000} seconds") 
            #imprime para n columnas tarda delta_microsecs de tiempo
            result[n_cols] = delta_microsecs # 
        #else:
        #    print(f"for {n_cols} columns it took {delta_microsecs / 1_000_000} seconds")
    except MemoryError: #cuando se genera la excepción
        #en caso de que utilice muchos recursos del pc
        print(f"data doesn't fit in memory for {n_cols} columns")

#regresion con sklearn para las x e y

def sklearn_reg(x, y):
    reg = LinearRegression()
    reg.fit(x, y) #toma los valor x e y ya definidos

#regresion con numpy para las x e y
def np_reg(x, y): #toma los valor x e y ya definidos
    # agregar columna de unos
    x_ = np.hstack((np.ones((x.shape[0], 1)), x))

    # estimador (x'x)^-1 * (x'y)
    return np.matmul(np.linalg.inv(np.matmul(x_.T, x_)),np.matmul(x_.T, y))

#regresion con timeout segundos m columnas de inicio, m++ columnas finales    
def time_reg(timeout, cols_min, cols_max, reg_fn, square=False): #square es para poner cuando sea X2

    timing = {}
    threads = []

    for n_cols in mult_range(cols_min, cols_max):
        try:
            gc.collect()
            x, y = gen_dataset(n_rows, n_cols)
            if square:
                x = np.square(x)

            thread = threading.Thread(target=timeit, args=(timeout, n_cols, timing, reg_fn, x, y))

            thread.start()
            for i in range(timeout):
                time.sleep(1)
                if not thread.is_alive():
                    break
            else:
                print(f"for {n_cols} columns it took more than {timeout} seconds")
        except MemoryError:
            print(f"data doesn't fit in memory for {n_cols} columns")

    return timing


def plot_time(timing):
    fig = plt.figure(figsize=(10, 10))
    plt.plot(timing.keys(), timing.values())
    #plt.axis((0, 1_000_000, 0, 1_000_000))
    plt.xlabel('time (μs)')
    plt.ylabel('columns')
    plt.show()


plot_time(time_reg(timeout, cols_min, cols_max, sklearn_reg)) 
#generar gráfico con el tiempo que demora según cantidad de columnas

plot_time(time_reg(timeout, cols_min, cols_max, np_reg))
#generar gráfico con el tiempo que demora según cantidad de columnas
``

0 个答案:

没有答案