From aea6462b81e42ee5ef582de6da353f8869642735 Mon Sep 17 00:00:00 2001
From: Josh Levy <levy.5674@gmail.com>
Date: Mon, 16 Jan 2017 20:37:42 -0600
Subject: [PATCH] [MRG+1] Fixes #8198 - error in datasets.make_moons (#8199)

---
 doc/whats_new.rst                                |  4 ++++
 sklearn/datasets/samples_generator.py            |  4 ++--
 sklearn/datasets/tests/test_samples_generator.py | 10 ++++++++++
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/doc/whats_new.rst b/doc/whats_new.rst
index 34f82c30e9..a0e2509957 100644
--- a/doc/whats_new.rst
+++ b/doc/whats_new.rst
@@ -140,6 +140,10 @@ Enhancements
 Bug fixes
 .........
 
+   - Fixed a bug where :func:`sklearn.datasets.make_moons` gives an
+     incorrect result when ``n_samples`` is odd.
+     :issue:`8198` by :user:`Josh Levy <levy5674>`.
+
    - Fixed a bug where :class:`sklearn.linear_model.LassoLars` does not give
      the same result as the LassoLars implementation available
      in R (lars library). :issue:`7849` by :user:`Jair Montoya Martinez <jmontoyam>`
diff --git a/sklearn/datasets/samples_generator.py b/sklearn/datasets/samples_generator.py
index 8321159c35..e7f61b3227 100644
--- a/sklearn/datasets/samples_generator.py
+++ b/sklearn/datasets/samples_generator.py
@@ -665,8 +665,8 @@ def make_moons(n_samples=100, shuffle=True, noise=None, random_state=None):
 
     X = np.vstack((np.append(outer_circ_x, inner_circ_x),
                    np.append(outer_circ_y, inner_circ_y))).T
-    y = np.hstack([np.zeros(n_samples_in, dtype=np.intp),
-                   np.ones(n_samples_out, dtype=np.intp)])
+    y = np.hstack([np.zeros(n_samples_out, dtype=np.intp),
+                   np.ones(n_samples_in, dtype=np.intp)])
 
     if shuffle:
         X, y = util_shuffle(X, y, random_state=generator)
diff --git a/sklearn/datasets/tests/test_samples_generator.py b/sklearn/datasets/tests/test_samples_generator.py
index 324df959bd..cd4d4148c0 100644
--- a/sklearn/datasets/tests/test_samples_generator.py
+++ b/sklearn/datasets/tests/test_samples_generator.py
@@ -24,6 +24,7 @@ from sklearn.datasets import make_friedman1
 from sklearn.datasets import make_friedman2
 from sklearn.datasets import make_friedman3
 from sklearn.datasets import make_low_rank_matrix
+from sklearn.datasets import make_moons
 from sklearn.datasets import make_sparse_coded_signal
 from sklearn.datasets import make_sparse_uncorrelated
 from sklearn.datasets import make_spd_matrix
@@ -360,3 +361,12 @@ def test_make_checkerboard():
     X2, _, _ = make_checkerboard(shape=(100, 100), n_clusters=2,
                                  shuffle=True, random_state=0)
     assert_array_equal(X1, X2)
+
+
+def test_make_moons():
+    X, y = make_moons(3, shuffle=False)
+    for x, label in zip(X, y):
+        center = [0.0, 0.0] if label == 0 else [1.0, 0.5]
+        dist_sqr = ((x - center) ** 2).sum()
+        assert_almost_equal(dist_sqr, 1.0,
+                            err_msg="Point is not on expected unit circle")
-- 
GitLab