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, xi
es la primera característica de todos los datos, xj
es la segunda característica y xij
es el resultado después de multiplicar las dos características.
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.