2011-08-05 22:36:51 +08:00
|
|
|
"""
|
2011-08-24 00:03:01 +08:00
|
|
|
==============================================
|
|
|
|
|
Label Propagation learning a complex structure
|
|
|
|
|
==============================================
|
2011-08-05 22:36:51 +08:00
|
|
|
|
|
|
|
|
Example of LabelPropagation learning a complex internal structure
|
2011-08-10 07:02:28 +08:00
|
|
|
to demonstrate "manifold learning". The outer circle should be
|
2011-08-08 11:58:34 +08:00
|
|
|
labeled "red" and the inner circle "blue". Because both label groups
|
2011-08-10 07:02:28 +08:00
|
|
|
lie inside their own distinct shape, we can see that the labels
|
2011-08-08 11:58:34 +08:00
|
|
|
propagate correctly around the circle.
|
2011-08-05 22:36:51 +08:00
|
|
|
"""
|
2013-02-01 22:04:03 +08:00
|
|
|
print(__doc__)
|
2011-08-05 22:36:51 +08:00
|
|
|
|
2012-02-02 17:55:32 +08:00
|
|
|
# Authors: Clay Woolam <clay@woolam.org>
|
2012-03-04 07:33:24 +08:00
|
|
|
# Andreas Mueller <amueller@ais.uni-bonn.de>
|
2016-04-01 08:25:31 +08:00
|
|
|
# License: BSD
|
2012-02-02 17:55:32 +08:00
|
|
|
|
2011-08-05 22:36:51 +08:00
|
|
|
import numpy as np
|
2014-05-15 04:31:03 +08:00
|
|
|
import matplotlib.pyplot as plt
|
2019-10-29 10:59:02 +08:00
|
|
|
from sklearn.semi_supervised import LabelSpreading
|
2012-03-04 07:33:24 +08:00
|
|
|
from sklearn.datasets import make_circles
|
2011-08-05 22:36:51 +08:00
|
|
|
|
2011-08-08 11:58:34 +08:00
|
|
|
# generate ring with inner box
|
2012-03-04 21:38:14 +08:00
|
|
|
n_samples = 200
|
2012-04-28 18:04:36 +08:00
|
|
|
X, y = make_circles(n_samples=n_samples, shuffle=False)
|
2012-01-22 06:40:34 +08:00
|
|
|
outer, inner = 0, 1
|
2018-07-23 15:49:01 +08:00
|
|
|
labels = np.full(n_samples, -1.)
|
2012-03-04 21:38:14 +08:00
|
|
|
labels[0] = outer
|
|
|
|
|
labels[-1] = inner
|
2011-08-08 11:58:34 +08:00
|
|
|
|
2017-06-20 20:48:57 +08:00
|
|
|
# #############################################################################
|
2011-09-15 10:06:35 +08:00
|
|
|
# Learn with LabelSpreading
|
2019-10-29 10:59:02 +08:00
|
|
|
label_spread = LabelSpreading(kernel='knn', alpha=0.8)
|
2012-03-04 07:33:24 +08:00
|
|
|
label_spread.fit(X, labels)
|
2011-08-08 11:58:34 +08:00
|
|
|
|
2017-06-20 20:48:57 +08:00
|
|
|
# #############################################################################
|
2011-09-15 10:06:35 +08:00
|
|
|
# Plot output labels
|
2011-08-12 15:40:29 +08:00
|
|
|
output_labels = label_spread.transduction_
|
2014-05-15 04:31:03 +08:00
|
|
|
plt.figure(figsize=(8.5, 4))
|
|
|
|
|
plt.subplot(1, 2, 1)
|
2015-10-24 01:06:53 +08:00
|
|
|
plt.scatter(X[labels == outer, 0], X[labels == outer, 1], color='navy',
|
|
|
|
|
marker='s', lw=0, label="outer labeled", s=10)
|
|
|
|
|
plt.scatter(X[labels == inner, 0], X[labels == inner, 1], color='c',
|
|
|
|
|
marker='s', lw=0, label='inner labeled', s=10)
|
|
|
|
|
plt.scatter(X[labels == -1, 0], X[labels == -1, 1], color='darkorange',
|
|
|
|
|
marker='.', label='unlabeled')
|
|
|
|
|
plt.legend(scatterpoints=1, shadow=False, loc='upper right')
|
|
|
|
|
plt.title("Raw data (2 classes=outer and inner)")
|
2011-08-08 11:58:34 +08:00
|
|
|
|
2014-05-15 04:31:03 +08:00
|
|
|
plt.subplot(1, 2, 2)
|
2011-08-10 07:02:28 +08:00
|
|
|
output_label_array = np.asarray(output_labels)
|
2012-03-04 07:33:24 +08:00
|
|
|
outer_numbers = np.where(output_label_array == outer)[0]
|
|
|
|
|
inner_numbers = np.where(output_label_array == inner)[0]
|
2015-10-24 01:06:53 +08:00
|
|
|
plt.scatter(X[outer_numbers, 0], X[outer_numbers, 1], color='navy',
|
|
|
|
|
marker='s', lw=0, s=10, label="outer learned")
|
|
|
|
|
plt.scatter(X[inner_numbers, 0], X[inner_numbers, 1], color='c',
|
|
|
|
|
marker='s', lw=0, s=10, label="inner learned")
|
|
|
|
|
plt.legend(scatterpoints=1, shadow=False, loc='upper right')
|
2014-05-15 04:31:03 +08:00
|
|
|
plt.title("Labels learned with Label Spreading (KNN)")
|
2011-08-05 22:36:51 +08:00
|
|
|
|
2014-05-15 04:31:03 +08:00
|
|
|
plt.subplots_adjust(left=0.07, bottom=0.07, right=0.93, top=0.92)
|
|
|
|
|
plt.show()
|