From 5f356c7a48047ea1d53984003cb39d035cf4e7da Mon Sep 17 00:00:00 2001 From: Rebecca Bilbro Date: Sun, 14 Jun 2020 21:35:35 -0400 Subject: [PATCH] fleshes out rankd tests, closes #435 --- .../test_rankd/test_rank1d_horizontal.png | Bin 0 -> 3823 bytes .../test_rankd/test_rank1d_orientation.png | Bin 3959 -> 0 bytes .../test_rankd/test_rank1d_shapiro.png | Bin 3846 -> 3823 bytes .../test_rankd/test_rank1d_vertical.png | Bin 0 -> 3922 bytes .../test_rankd/test_rank2d_covariance.png | Bin 11470 -> 11506 bytes .../test_rankd/test_rank2d_kendalltau.png | Bin 11704 -> 11483 bytes .../test_rankd/test_rank2d_pearson.png | Bin 11689 -> 11524 bytes .../test_rankd/test_rank2d_spearman.png | Bin 11682 -> 11482 bytes tests/test_features/test_rankd.py | 705 +++++++----------- 9 files changed, 251 insertions(+), 454 deletions(-) create mode 100644 tests/baseline_images/test_features/test_rankd/test_rank1d_horizontal.png delete mode 100644 tests/baseline_images/test_features/test_rankd/test_rank1d_orientation.png create mode 100644 tests/baseline_images/test_features/test_rankd/test_rank1d_vertical.png diff --git a/tests/baseline_images/test_features/test_rankd/test_rank1d_horizontal.png b/tests/baseline_images/test_features/test_rankd/test_rank1d_horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..077291a4233d2a5da9a6cd96263934a88e254334 GIT binary patch literal 3823 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYU{d2?1B$GUdv_2>u@pObhHwBu4M$1`kk47* z5n0T@z@G@hj4SMyX95K+N?apKg7ec#$`gxH8FCX#3UcyGax#+?%2JDpGxPI|^^Eik zbrdp6N(!v>^%3%V`9lFzshIQju3=V6xK!K2;N~R{7RhRq1}&7$ zQ103);tIsMNBMYmXGyyt^ z>Hn=?Kq^6wiG_jT1cv|vgMzXH14Ba(10w^2(WoF90dnT(HTDm?|V?NVDt6wk9X8o-2257q#rHsa1LVo-~Asx zmhAt^IcK6c8NoDYQ*0^ze$3N3z3HpwoSP2|Bwp|8`&*a)-t$I{-nV(( zdmsL;WF#$z>}&aVbk9Ed<8KdtzLq|r>gF$oBD4A3d!Hx0zjXZa-)rh0#4AWNaj@pj zn4DUM`FCUDd$%9oy;0}%wdDnA?S~WBytexGd+%QL#Lqi#RO@|fd;gr3v?Aw+&@b`N zzv^VR^Pi8N@AxY9HS>v^kjVJo)xZ4rT7QKnB$_x_i@V~DUm0u4ifc{p$-O_eNhf;# zp_#IL?HkvKFZIU;kR<$ylHTDUcf5x2K{2iEsBmc!U6n`EjLAdkAF9y5aJNHTD z_m?L}PFw5$@C;x3;fU*{Z@yPo`yT?9|KPsYx2nQmt3g^9lp7=yq)A0do2rj+(`|(S=pXCo^ zMgx#=GYESw2DQBY&jeQ_54t~$n0!oX5+tW}nO1H!*DqTB;QqgVKA(SFV%2;4^y!Va z-+~*obNwFQ-k$$$UI(OBtClu@pObhHwBu4M$1`kk47* z5n0T@z@G@hj4SMyX95K+N?apKg7ec#$`gxH8FCX#3UcyGax#+?%2JDpGxPI|^$hil zbQCg5N(!v>^%3%V`9g0*6!Kv(;H+&vC z-Rlp3SXv=^vp-ZqKw9jk56p>~yQtZ?BqHS5Q~ez_|BOK-_VOWJU%C zjz5|2nHd-w^4l4JJR>F+28I(H0t^fa$__x$o>4(E0_1bvd*&bg{PK1>$vsaCEZ)=t z6VCj?{r9Jr#!mnK{{H*gQ?peazy9F=>H1`b z51Ncjd%Elsm>K?a?{8vdU`VN9Vmgpl)5P}S?MF@y28IcO3JeSmZVkX(Bgx1FlxGp2_tX!BKNiMTy!;TdVmL7QlWMKpM1P_yg2(kPKN5~foPJw&`*+Xs zid#@^t>B&K0I-TRUeDC=RE3>(q&znh~y_tT_uK3%{w8cA%(EKeZ>A~`MP44yArq!<_ zIVZ4hUiZ4lYA)8Kc&hf#udAFeI}3Y%r`ZKZ*Q5?}k_BD?vA#qHbj-#&l(^eK1!B}7#SDw^JW z-Wt39`kS@szy=(w5rnm<`}jJ1{d4aZG^(*jn?;m031^n}7=E*Bs{j3Tdi*qC!^c8q zlllLD{q<@2Z(pvj|M^+`@0?n2SV-~P{py+3nUPB8!c@X%Qf v*hu~Jy^enZyj>6KHN78gwUX9i|HmrsJz>GzK)z&PbDzP})z4*}Q$iB}5pv5| diff --git a/tests/baseline_images/test_features/test_rankd/test_rank1d_shapiro.png b/tests/baseline_images/test_features/test_rankd/test_rank1d_shapiro.png index afaa5323ff940b75b0791d51dbea8e75dfe60f6f..077291a4233d2a5da9a6cd96263934a88e254334 100644 GIT binary patch literal 3823 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 ag7pladg>W`kDa>900f?{elF{r5}E+|N3;e2 literal 0 HcmV?d00001 diff --git a/tests/baseline_images/test_features/test_rankd/test_rank2d_covariance.png b/tests/baseline_images/test_features/test_rankd/test_rank2d_covariance.png index 22037230a6c8d808f5c84781d41f6bb4e40cd335..8e124750db4b0c0f80bffccc9683c780208ceb40 100644 GIT binary patch literal 11506 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 literal 11470 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 diff --git a/tests/baseline_images/test_features/test_rankd/test_rank2d_kendalltau.png b/tests/baseline_images/test_features/test_rankd/test_rank2d_kendalltau.png index 2047cde2da1abd26df3bd529fadc615452f71f25..4f7fc6ad95fd8085363eaceb22bab9cf975dd8b4 100644 GIT binary patch literal 11483 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 literal 11704 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 diff --git a/tests/baseline_images/test_features/test_rankd/test_rank2d_pearson.png b/tests/baseline_images/test_features/test_rankd/test_rank2d_pearson.png index 2977e4eb2e109802f9c4688f3b01f97f537e4beb..43384bcd7aa5c1c426ec58107cf68a1712d7054b 100644 GIT binary patch literal 11524 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

PT}^XaAD{M_~RI%t1Q zYwCZuc#kF3hhQkw)zuYWRcK!gtIi1YEDR|=3^I!FFAZTgMq|)hkdVZ_WRtf~k2F?l#D4~oLd0XDj5Sc~koG;hscsX<< zx2~sA2ix*UXi))>2UXYS$M*_A2uC}G3R0S4cV9tewN{_8_u%eYorxt-EfdC-2A}GP z`h1_et6yJBy|=el6v}EwGm}!|2OF0uYwc>;VNG&ESYpJac?rEZ8uxMXxyejf@dKzU zbaWI9$qSy@v|wP+{DPeiC%#!0mI78DflUk(ygm+C6@y3XGQ9(!Ls5io{r=V9JTr%# z5p?{u{P)oK&HDUa!uV~U#c%2-^@Gp-wr%6PD>F_p!K{^HjM;D?gSH@>_9v59o{


1dS zfD@h{^vxmE?EZ=cul1NI2WGi76g8@|oI2+7vdpE?z8@n?PaBl5A(-%HwVu_nZ_nR> z^a?!3vtzrHjnhOObH6_Hd9l@|EZjKL-UOwm9Qd?L!oHU~JB% z;X-z7KvorP2qO@_30wS=C!6uQu$Xf3@&dPX=*D%|HZ2KC=x;AjhD0*wH$S7!zC?sm z(_4whi+La(HfV{RltTpzz*p+*B)P{>rxO(gS8OUMBOwt)w?8LOo+LnO%kV0K0&_Jm z%sKLod}fh#UGex=v%IRqInKql+x&elbAcZmFVe}YS22FpA;>|GSfJ)=RVIZ#p5udU z%JCe|*$@TFz&Sw~9P_CvSQx7YTlF%k&Ovf?J=ll4Pg}R#;5b8rfB__}%U`d|Qw2 zvF|8UtxvJwM|(5~gpWx^+EB*%TR`!dMQKTF8YEHw{rMC1W@&Jv9$=^Aa&mSc2M7De z>?WcG5%{Ieq|yQj*aJ@d%5L_pFa$^H4D?DMF$kanDhwhb7D12qOjq1uEF%r^<3RrauZ?ivNDJkK>lK#T^=@rGx6Gp@9nIy2=CT1cJvvMnfmC zzVd&?aC19eoOmC&M(#xM`Uvw?fHj;an{0`&OK~BHN=KA)dqLEFNxrZUy$}-kzm2E= e@s`{%8dJjk{(l}GxgU;!pS_y88Y${W&;J*r`r~B) literal 11689 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 UK8Mc@82EEcQ%561{o?Qc1&t{3H2?qr literal 11682 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 diff --git a/tests/test_features/test_rankd.py b/tests/test_features/test_rankd.py index a5d6e03ef..321a9092e 100644 --- a/tests/test_features/test_rankd.py +++ b/tests/test_features/test_rankd.py @@ -21,15 +21,13 @@ import numpy as np import numpy.testing as npt -from tests.base import IS_WINDOWS_OR_CONDA, VisualTestCase - -from yellowbrick.datasets import load_occupancy, load_credit -from yellowbrick.features.rankd import * -from yellowbrick.features.rankd import kendalltau from yellowbrick.features.rankd import RankDBase -from sklearn.datasets import make_regression - +from yellowbrick.features.rankd import kendalltau +from yellowbrick.features.rankd import Rank1D, rank1d +from yellowbrick.features.rankd import Rank2D, rank2d from yellowbrick.exceptions import YellowbrickValueError +from tests.base import IS_WINDOWS_OR_CONDA, VisualTestCase +from yellowbrick.datasets import load_occupancy, load_credit, load_energy try: import pandas as pd @@ -37,34 +35,11 @@ pd = None -@pytest.fixture(scope="class") -def dataset(request): - """ - Creates a dataset with 6 gaussian features and 2 categorical features - for testing the RankD ranking algorithms. The gaussian features have - different correlations with respect to each other, including strong - positive and negative correlation and no correlation at all. - """ - X, _ = make_regression( - n_samples=100, - n_features=6, - effective_rank=2, - tail_strength=0, - n_informative=2, - noise=0.45, - random_state=27, - ) - - rand = np.random.RandomState(seed=27) - request.cls.dataset = np.concatenate((X, rand.binomial(1, 0.6, (100, 2))), axis=1) - - ########################################################################## ## Kendall-Tau Tests ########################################################################## -@pytest.mark.usefixtures("dataset") class TestKendallTau(object): """ Test the Kendall-Tau correlation metric @@ -74,97 +49,29 @@ def test_kendalltau(self): """ Test results returned match expectations """ + X, _ = load_energy(return_dataset=True).to_numpy() + expected = np.array( [ - [ - 1.0, - -0.68, - -0.57454545, - 0.49858586, - 0.07555556, - -0.05858586, - 0.02387848, - 0.11357219, - ], - [ - -0.68, - 1.0, - 0.58666667, - -0.69090909, - -0.22262626, - -0.17171717, - -0.05059964, - -0.12397575, - ], - [ - -0.57454545, - 0.58666667, - 1.0, - -0.61050505, - 0.18909091, - 0.07515152, - 0.00341121, - -0.0638663, - ], - [ - 0.49858586, - -0.69090909, - -0.61050505, - 1.0, - 0.11070707, - 0.3030303, - 0.03013237, - 0.07542581, - ], - [ - 0.07555556, - -0.22262626, - 0.18909091, - 0.11070707, - 1.0, - 0.4610101, - 0.01648752, - 0.05982047, - ], - [ - -0.05858586, - -0.17171717, - 0.07515152, - 0.3030303, - 0.4610101, - 1.0, - 0.03695479, - -0.02398599, - ], - [ - 0.02387848, - -0.05059964, - 0.00341121, - 0.03013237, - 0.01648752, - 0.03695479, - 1.0, - 0.18298883, - ], - [ - 0.11357219, - -0.12397575, - -0.0638663, - 0.07542581, - 0.05982047, - -0.02398599, - 0.18298883, - 1.0, - ], + [1.0, -1.0, -0.2724275, -0.7361443, 0.7385489, 0.0, 0.0, 0.0], + [-1.0, 1.0, 0.2724275, 0.7361443, -0.7385489, 0.0, 0.0, 0.0], + [-0.2724275, 0.2724275, 1.0, -0.15192004, 0.19528337, 0.0, 0.0, 0.0], + [-0.73614431, 0.73614431, -0.15192004, 1.0, -0.87518995, 0.0, 0.0, 0.0], + [0.73854895, -0.73854895, 0.19528337, -0.87518995, 1.0, 0.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.15430335], + [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15430335, 1.0], ] ) - npt.assert_almost_equal(expected, kendalltau(self.dataset)) + actual = kendalltau(X) + npt.assert_almost_equal(expected, actual) def test_kendalltau_shape(self): """ Assert that a square correlation matrix is returned """ - corr = kendalltau(self.dataset) + X, _ = load_energy(return_dataset=True).to_numpy() + corr = kendalltau(X) assert corr.shape[0] == corr.shape[1] for (i, j), val in np.ndenumerate(corr): @@ -184,7 +91,6 @@ def test_kendalltau_1D(self): ########################################################################## -@pytest.mark.usefixtures("dataset") class TestRankDBase(VisualTestCase): """ Test the RankDBase Visualizer @@ -194,11 +100,12 @@ def test_rankdbase_unknown_algorithm(self): """ Assert that unknown algorithms raise an exception """ + X, _ = load_energy(return_dataset=True).to_numpy() with pytest.raises( YellowbrickValueError, match=".* is unrecognized ranking method" ) as e: oz = RankDBase(algorithm="unknown") - oz.fit_transform(self.dataset) + oz.fit_transform(X) assert str(e.value) == "'unknown' is unrecognized ranking method" @@ -207,47 +114,69 @@ def test_rankdbase_unknown_algorithm(self): ########################################################################## -@pytest.mark.usefixtures("dataset") class TestRank1D(VisualTestCase): """ Test the Rank1D visualizer """ + def test_rank1d_unknown_algorithm(self): + """ + Test that an error is raised for Rank1D with an unknown algorithm + """ + X, _ = load_energy() + msg = "'oscar' is unrecognized ranking method" + with pytest.raises(YellowbrickValueError, match=msg): + Rank1D(algorithm="Oscar").transform(X) + def test_rank1d_shapiro(self): """ Test Rank1D using shapiro metric """ + X, _ = load_energy(return_dataset=True).to_numpy() oz = Rank1D(algorithm="shapiro") - npt.assert_array_equal(oz.fit_transform(self.dataset), self.dataset) + npt.assert_array_equal(oz.fit_transform(X), X) # Check Ranking expected = np.array( [ - 0.985617, - 0.992236, - 0.982354, - 0.984898, - 0.978514, - 0.990372, - 0.636401, - 0.624511, + 0.93340671, + 0.94967198, + 0.92689574, + 0.7459445, + 0.63657606, + 0.85603625, + 0.84349269, + 0.91551381, ] ) assert hasattr(oz, "ranks_") - assert oz.ranks_.shape == (self.dataset.shape[1],) + assert oz.ranks_.shape == (X.shape[1],) npt.assert_array_almost_equal(oz.ranks_, expected) # Image similarity comparison oz.finalize() self.assert_images_similar(oz) - def test_rank1d_orientation(self): + def test_rank1d_vertical(self): """ Test Rank1D using vertical orientation """ + X, _ = load_energy(return_dataset=True).to_numpy() oz = Rank1D(orient="v") - npt.assert_array_equal(oz.fit_transform(self.dataset), self.dataset) + npt.assert_array_equal(oz.fit_transform(X), X) + + # Image similarity comparison + oz.finalize() + self.assert_images_similar(oz) + + def test_rank1d_horizontal(self): + """ + Test Rank1D using horizontal orientation + """ + X, _ = load_energy(return_dataset=True).to_numpy() + oz = Rank1D(orient="h") + npt.assert_array_equal(oz.fit_transform(X), X) # Image similarity comparison oz.finalize() @@ -306,16 +235,24 @@ def test_rank1d_quick_method(self): assert isinstance(viz, Rank1D) self.assert_images_similar(viz, tol=0.1) + ########################################################################## ## Rank2D Test Cases ########################################################################## -@pytest.mark.usefixtures("dataset") class TestRank2D(VisualTestCase): """ Test the Rank2D visualizer """ + def test_rank2d_unknown_algorithm(self): + """ + Test that an error is raised for Rank2D with an unknown algorithm + """ + X, _ = load_energy() + msg = "'oscar' is unrecognized ranking method" + with pytest.raises(YellowbrickValueError, match=msg): + Rank2D(algorithm="Oscar").transform(X) @pytest.mark.xfail( IS_WINDOWS_OR_CONDA, @@ -325,97 +262,98 @@ def test_rank2d_pearson(self): """ Test Rank2D using pearson metric """ + X, _ = load_energy(return_dataset=True).to_numpy() oz = Rank2D(algorithm="pearson") - npt.assert_array_equal(oz.fit_transform(self.dataset), self.dataset) + npt.assert_array_equal(oz.fit_transform(X), X) # Check Ranking expected = np.array( [ [ - 1.0, - -0.86937243, - -0.77884764, - 0.71424708, - 0.10836854, - -0.11550965, - 0.04494811, - 0.1725682, - ], - [ - -0.86937243, - 1.0, - 0.80436327, - -0.9086706, - -0.31117192, - -0.26313947, - -0.0711807, - -0.16924862, - ], - [ - -0.77884764, - 0.80436327, - 1.0, - -0.85520468, - 0.30940711, - 0.10634903, - -0.02485686, - -0.10230028, - ], - [ - 0.71424708, - -0.9086706, - -0.85520468, - 1.0, - 0.12537213, - 0.41306822, - 0.04704408, - 0.1031842, - ], - [ - 0.10836854, - -0.31117192, - 0.30940711, - 0.12537213, - 1.0, - 0.671111, - 0.06777278, - 0.09513859, - ], - [ - -0.11550965, - -0.26313947, - 0.10634903, - 0.41306822, - 0.671111, - 1.0, - 0.04684117, - -0.01072631, - ], - [ - 0.04494811, - -0.0711807, - -0.02485686, - 0.04704408, - 0.06777278, - 0.04684117, - 1.0, - 0.18298883, - ], - [ - 0.1725682, - -0.16924862, - -0.10230028, - 0.1031842, - 0.09513859, - -0.01072631, - 0.18298883, - 1.0, + 1.00000000e00, + -9.91901462e-01, + -2.03781680e-01, + -8.68823408e-01, + 8.27747317e-01, + 0.00000000e00, + 1.11706815e-16, + -1.12935670e-16, + ], + [ + -9.91901462e-01, + 1.00000000e00, + 1.95501633e-01, + 8.80719517e-01, + -8.58147673e-01, + 0.00000000e00, + -2.26567708e-16, + -3.55861251e-16, + ], + [ + -2.03781680e-01, + 1.95501633e-01, + 1.00000000e00, + -2.92316466e-01, + 2.80975743e-01, + 0.00000000e00, + 7.87010445e-18, + 0.00000000e00, + ], + [ + -8.68823408e-01, + 8.80719517e-01, + -2.92316466e-01, + 1.00000000e00, + -9.72512237e-01, + 0.00000000e00, + -3.27553310e-16, + 2.20057668e-16, + ], + [ + 8.27747317e-01, + -8.58147673e-01, + 2.80975743e-01, + -9.72512237e-01, + 1.00000000e00, + 0.00000000e00, + -1.24094525e-18, + 0.00000000e00, + ], + [ + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 1.00000000e00, + -2.42798319e-19, + 0.00000000e00, + ], + [ + 1.11706815e-16, + -2.26567708e-16, + 7.87010445e-18, + -3.27553310e-16, + -1.24094525e-18, + -2.42798319e-19, + 1.00000000e00, + 2.12964221e-01, + ], + [ + -1.12935670e-16, + -3.55861251e-16, + 0.00000000e00, + 2.20057668e-16, + 0.00000000e00, + 0.00000000e00, + 2.12964221e-01, + 1.00000000e00, ], ] ) assert hasattr(oz, "ranks_") - assert oz.ranks_.shape == (self.dataset.shape[1], self.dataset.shape[1]) + assert oz.ranks_.shape == (X.shape[1], X.shape[1]) npt.assert_array_almost_equal(oz.ranks_, expected) # Image similarity comparision @@ -430,98 +368,99 @@ def test_rank2d_covariance(self): """ Test Rank2D using covariance metric """ + X, _ = load_energy(return_dataset=True).to_numpy() oz = Rank2D(algorithm="covariance") - npt.assert_array_equal(oz.fit_transform(self.dataset), self.dataset) + npt.assert_array_equal(oz.fit_transform(X), X) # Check Ranking expected = np.array( [ [ - 4.09266931e-03, - -1.41062431e-03, - -2.26778429e-03, - 3.13507202e-03, - 2.21273274e-04, - -5.05566875e-04, - 1.44499782e-03, - 5.45713163e-03, - ], - [ - -1.41062431e-03, - 6.43286363e-04, - 9.28539346e-04, - -1.58126396e-03, - -2.51898163e-04, - -4.56609749e-04, - -9.07228811e-04, - -2.12191333e-03, - ], - [ - -2.26778429e-03, - 9.28539346e-04, - 2.07153281e-03, - -2.67061756e-03, - 4.49467833e-04, - 3.31158917e-04, - -5.68518509e-04, - -2.30156415e-03, - ], - [ - 3.13507202e-03, - -1.58126396e-03, - -2.67061756e-03, - 4.70751209e-03, - 2.74548546e-04, - 1.93898526e-03, - 1.62200836e-03, - 3.49952628e-03, - ], - [ - 2.21273274e-04, - -2.51898163e-04, - 4.49467833e-04, - 2.74548546e-04, - 1.01869657e-03, - 1.46545939e-03, - 1.08700151e-03, - 1.50099581e-03, - ], - [ - -5.05566875e-04, - -4.56609749e-04, - 3.31158917e-04, - 1.93898526e-03, - 1.46545939e-03, - 4.68073451e-03, - 1.61041253e-03, - -3.62750059e-04, - ], - [ - 1.44499782e-03, - -9.07228811e-04, - -5.68518509e-04, - 1.62200836e-03, - 1.08700151e-03, - 1.61041253e-03, - 2.52525253e-01, - 4.54545455e-02, - ], - [ - 5.45713163e-03, - -2.12191333e-03, - -2.30156415e-03, - 3.49952628e-03, - 1.50099581e-03, - -3.62750059e-04, - 4.54545455e-02, - 2.44343434e-01, + 1.11888744e-02, + -9.24206867e00, + -9.40391134e-01, + -4.15083877e00, + 1.53324641e-01, + 0.00000000e00, + 1.57414282e-18, + -1.85278419e-17, + ], + [ + -9.24206867e00, + 7.75916384e03, + 7.51290743e02, + 3.50393655e03, + -1.32370274e02, + 0.00000000e00, + -2.65874531e-15, + -4.86170571e-14, + ], + [ + -9.40391134e-01, + 7.51290743e02, + 1.90326988e03, + -5.75989570e02, + 2.14654498e01, + 0.00000000e00, + 4.57406096e-17, + 0.00000000e00, + ], + [ + -4.15083877e00, + 3.50393655e03, + -5.75989570e02, + 2.03996306e03, + -7.69178618e01, + 0.00000000e00, + -1.97089918e-15, + 1.54151644e-14, + ], + [ + 1.53324641e-01, + -1.32370274e02, + 2.14654498e01, + -7.69178618e01, + 3.06649283e00, + 0.00000000e00, + -2.89497529e-19, + 0.00000000e00, + ], + [ + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 0.00000000e00, + 1.25162973e00, + -3.61871912e-20, + 0.00000000e00, + ], + [ + 1.57414282e-18, + -2.65874531e-15, + 4.57406096e-17, + -1.97089918e-15, + -2.89497529e-19, + -3.61871912e-20, + 1.77477184e-02, + 4.40026076e-02, + ], + [ + -1.85278419e-17, + -4.86170571e-14, + 0.00000000e00, + 1.54151644e-14, + 0.00000000e00, + 0.00000000e00, + 4.40026076e-02, + 2.40547588e00, ], ] ) assert hasattr(oz, "ranks_") - assert oz.ranks_.shape == (self.dataset.shape[1], self.dataset.shape[1]) - npt.assert_array_almost_equal(oz.ranks_, expected) + assert oz.ranks_.shape == (X.shape[1], X.shape[1]) + npt.assert_array_almost_equal(oz.ranks_, expected, decimal=5) # Image similarity comparision oz.finalize() @@ -535,97 +474,26 @@ def test_rank2d_spearman(self): """ Test Rank2D using spearman metric """ + X, _ = load_energy(return_dataset=True).to_numpy() oz = Rank2D(algorithm="spearman") - npt.assert_array_equal(oz.fit_transform(self.dataset), self.dataset) + npt.assert_array_equal(oz.fit_transform(X), X) # Check Ranking expected = np.array( [ - [ - 1.0, - -0.86889889, - -0.77551755, - 0.68520852, - 0.11369937, - -0.09489349, - 0.02909991, - 0.13840665, - ], - [ - -0.86889889, - 1.0, - 0.78232223, - -0.87065107, - -0.33450945, - -0.25244524, - -0.06166409, - -0.15108512, - ], - [ - -0.77551755, - 0.78232223, - 1.0, - -0.81636964, - 0.26846685, - 0.10348635, - 0.00415713, - -0.07783173, - ], - [ - 0.68520852, - -0.87065107, - -0.81636964, - 1.0, - 0.16316832, - 0.45167717, - 0.03672131, - 0.09191892, - ], - [ - 0.11369937, - -0.33450945, - 0.26846685, - 0.16316832, - 1.0, - 0.63986799, - 0.02009279, - 0.07290121, - ], - [ - -0.09489349, - -0.25244524, - 0.10348635, - 0.45167717, - 0.63986799, - 1.0, - 0.04503557, - -0.02923092, - ], - [ - 0.02909991, - -0.06166409, - 0.00415713, - 0.03672131, - 0.02009279, - 0.04503557, - 1.0, - 0.18298883, - ], - [ - 0.13840665, - -0.15108512, - -0.07783173, - 0.09191892, - 0.07290121, - -0.02923092, - 0.18298883, - 1.0, - ], + [1.0, -1.0, -0.25580533, -0.8708862, 0.86904819, 0.0, 0.0, 0.0], + [-1.0, 1.0, 0.25580533, 0.8708862, -0.86904819, 0.0, 0.0, 0.0], + [-0.25580533, 0.25580533, 1.0, -0.19345677, 0.22076336, 0.0, 0.0, 0.0], + [-0.8708862, 0.8708862, -0.19345677, 1.0, -0.93704257, 0.0, 0.0, 0.0], + [0.86904819, -0.86904819, 0.22076336, -0.93704257, 1.0, 0.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.18759162], + [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.18759162, 1.0], ] ) assert hasattr(oz, "ranks_") - assert oz.ranks_.shape == (self.dataset.shape[1], self.dataset.shape[1]) + assert oz.ranks_.shape == (X.shape[1], X.shape[1]) npt.assert_array_almost_equal(oz.ranks_, expected) # Image similarity comparision @@ -640,97 +508,26 @@ def test_rank2d_kendalltau(self): """ Test Rank2D using kendalltau metric """ + X, _ = load_energy(return_dataset=True).to_numpy() oz = Rank2D(algorithm="kendalltau") - npt.assert_array_equal(oz.fit_transform(self.dataset), self.dataset) + npt.assert_array_equal(oz.fit_transform(X), X) # Check Ranking expected = np.array( [ - [ - 1.0, - -0.68, - -0.57454545, - 0.49858586, - 0.07555556, - -0.05858586, - 0.02387848, - 0.11357219, - ], - [ - -0.68, - 1.0, - 0.58666667, - -0.69090909, - -0.22262626, - -0.17171717, - -0.05059964, - -0.12397575, - ], - [ - -0.57454545, - 0.58666667, - 1.0, - -0.61050505, - 0.18909091, - 0.07515152, - 0.00341121, - -0.0638663, - ], - [ - 0.49858586, - -0.69090909, - -0.61050505, - 1.0, - 0.11070707, - 0.3030303, - 0.03013237, - 0.07542581, - ], - [ - 0.07555556, - -0.22262626, - 0.18909091, - 0.11070707, - 1.0, - 0.4610101, - 0.01648752, - 0.05982047, - ], - [ - -0.05858586, - -0.17171717, - 0.07515152, - 0.3030303, - 0.4610101, - 1.0, - 0.03695479, - -0.02398599, - ], - [ - 0.02387848, - -0.05059964, - 0.00341121, - 0.03013237, - 0.01648752, - 0.03695479, - 1.0, - 0.18298883, - ], - [ - 0.11357219, - -0.12397575, - -0.0638663, - 0.07542581, - 0.05982047, - -0.02398599, - 0.18298883, - 1.0, - ], + [1.0, -1.0, -0.2724275, -0.73614431, 0.73854895, 0.0, 0.0, 0.0], + [-1.0, 1.0, 0.2724275, 0.73614431, -0.73854895, 0.0, 0.0, 0.0], + [-0.2724275, 0.2724275, 1.0, -0.15192004, 0.19528337, 0.0, 0.0, 0.0], + [-0.73614431, 0.73614431, -0.15192004, 1.0, -0.87518995, 0.0, 0.0, 0.0], + [0.73854895, -0.73854895, 0.19528337, -0.87518995, 1.0, 0.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0], + [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.15430335], + [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.15430335, 1.0], ] ) assert hasattr(oz, "ranks_") - assert oz.ranks_.shape == (self.dataset.shape[1], self.dataset.shape[1]) + assert oz.ranks_.shape == (X.shape[1], X.shape[1]) npt.assert_array_almost_equal(oz.ranks_, expected) # Image similarity comparision @@ -798,4 +595,4 @@ def test_rank2d_quick_method(self): oz = rank2d(X, y, algorithm="spearman", colormap="RdYlGn_r") assert isinstance(oz, Rank2D) - self.assert_images_similar(oz, tol=0.1) \ No newline at end of file + self.assert_images_similar(oz, tol=0.1)