以前の投稿でよく答えられたように、これはプログラミング言語で一般的な浮動小数点演算の問題です。型に完全な等式を適用しないように注意する必要がありfloat
ます。
このような比較がある場合は、与えられた許容値(しきい値)に基づいて比較する関数を使用できます。数値が十分に近い場合は、数値的に等しいと見なす必要があります。何かのようなもの:
def isequal_float(x1,x2, tol=10**(-8)):
"""Returns the results of floating point equality, according to a tolerance."""
return abs(x1 - x2)<tol
トリックを行います。私が間違っていない場合、正確な許容誤差は、float
型が単精度か倍精度かによって異なり、これは使用している言語によって異なります。
このような関数を使用すると、たとえばで計算結果を簡単に比較できますnumpy
。pandas
たとえば、次の例を見てみましょう。ここでは、メソッドpd.DataFrame.corr()
とnumpy
関数の2つの方法を使用して、連続変数を持つデータセットの相関行列が計算されnp.corrcoef()
ます。
import numpy as np
import seaborn as sns
iris = sns.load_dataset('iris')
iris.drop('species', axis = 1, inplace=True)
# calculate correlation coefficient matrices using two different methods
cor1 = iris.corr().to_numpy()
cor2 = np.corrcoef(iris.transpose())
print(cor1)
print(cor2)
結果は似ているようです:
[[ 1. -0.11756978 0.87175378 0.81794113]
[-0.11756978 1. -0.4284401 -0.36612593]
[ 0.87175378 -0.4284401 1. 0.96286543]
[ 0.81794113 -0.36612593 0.96286543 1. ]]
[[ 1. -0.11756978 0.87175378 0.81794113]
[-0.11756978 1. -0.4284401 -0.36612593]
[ 0.87175378 -0.4284401 1. 0.96286543]
[ 0.81794113 -0.36612593 0.96286543 1. ]]
しかし、それらの正確な平等の結果はそうではありません。これらの演算子:
print(cor1 == cor2)
print(np.equal(cor1, cor2))
ほとんどの場合、False
要素ごとに結果が得られます。
[[ True False False False]
[False False False False]
[False False False False]
[False False False True]]
同様に、np.array_equal(cor1, cor2)
も生成されFalse
ます。ただし、カスタムメイドの関数は必要な比較を提供します。
out = [isequal_float(i,j) for i,j in zip(cor1.reshape(16, ), cor2.reshape(16, ))]
print(out)
[True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
注: numpy配列で浮動小数点要素ごとの比較を実行numpy
する関数が含まれています。.allclose()
print(np.allclose(cor1, cor2))
>>>True