[Pandas] Resuelve el problema de que el resultado de multiplicar dos números positivos en pandas es un valor negativo

Utilicé sklearn para ajustar los datos hace unos días y descubrí que la curva era particularmente escandalosa. Busqué la razón durante mucho tiempo. Finalmente descubrí que era porque multipliqué las características en el código para aumentar la dimensión. de las características Sin embargo, los dos números positivos después de multiplicarse entre sí, se vuelven negativos:

En la siguiente figura, xies la primera característica de todos los datos, xjes la segunda característica y xijes el resultado después de multiplicar las dos características.
Por favor agregue la descripción de la imagen.
Después de probar con el siguiente código, se descubrió que la razón es que los datos son demasiado grandes y La multiplicación directa no causará errores, pero el resultado de la multiplicación en pandas es un valor negativo.

if __name__ == '__main__':
    a = 10000000000
    b = 70000000000
    print("a:{}, b:{}".format(a, b))
    print("a与b直接相乘:\n", a*b)
    pda = pd.DataFrame(np.array([a]))
    pdb = pd.DataFrame(np.array([b]))
    print("通过pandas相乘:")
    print(pda * pdb)
a:10000000000, b:70000000000
a与b直接相乘:
700000000000000000000
通过pandas相乘:
                   0
0 -976274800962961408

La razón del resultado negativo es que los datos originales son demasiado grandes y el resultado multiplicado excede el rango de números enteros que los pandas pueden expresar, lo que provoca un desbordamiento. Este fenómeno también existe en numpy.

Generalmente, los tipos organizativos de números enteros son: int8, int16, int32, int64, etc. Si los dos números multiplicados son desbordamientos causados ​​por el tipo entero de pandas que es int32, y el resultado después de la multiplicación se puede expresar en el rango de tipo int64 , luego simplemente cambie el tipo de datos de pandas de int32 a int64:

pda = pd.DataFrame(np.array([a]), dtype='int64')
pdb = pd.DataFrame(np.array([b]), dtype='int64')
res = pda * pdb

Si los dos números multiplicados son realmente demasiado grandes y el resultado de la multiplicación excede el rango que int64 puede representar, podemos usar la normalización para normalizar los datos a o, y los datos normalizados se multiplicarán (-1, 1)o (0, 1)elevarán al cuadrado. Los resultados se volverán normales.

Supongo que te gusta

Origin blog.csdn.net/qq_41340996/article/details/120571155
Recomendado
Clasificación