@@ -161,8 +161,50 @@ def silhouette_samples(X, labels, metric='euclidean', **kwds):
161
161
<http://en.wikipedia.org/wiki/Silhouette_(clustering)>`_
162
162
163
163
"""
164
+ < << << << HEAD
164
165
le = LabelEncoder ()
165
166
labels = le .fit_transform (labels )
167
+ == == == =
168
+ distances = pairwise_distances (X , metric = metric , ** kwds )
169
+ n = labels .shape [0 ]
170
+ A = np .array ([_intra_cluster_distance (distances [i ], labels , i )
171
+ for i in range (n )])
172
+ B = np .array ([_nearest_cluster_distance (distances [i ], labels , i )
173
+ for i in range (n )])
174
+ sil_samples = (B - A ) / np .maximum (A , B )
175
+ # nan values are for clusters of size 1, and should be 0
176
+ return np .nan_to_num (sil_samples )
177
+
178
+
179
+ def _intra_cluster_distance (distances_row , labels , i ):
180
+ """Calculate the mean intra-cluster distance for sample i.
181
+
182
+ Parameters
183
+ ----------
184
+ distances_row : array, shape = [n_samples]
185
+ Pairwise distance matrix between sample i and each sample.
186
+
187
+ labels : array, shape = [n_samples]
188
+ label values for each sample
189
+
190
+ i : int
191
+ Sample index being calculated. It is excluded from calculation and
192
+ used to determine the current label
193
+
194
+ Returns
195
+ -------
196
+ a : float
197
+ Mean intra-cluster distance for sample i
198
+ """
199
+ mask = labels == labels [i ]
200
+ mask [i ] = False
201
+ if not np .any (mask ):
202
+ # cluster of size 1
203
+ return 0
204
+ a = np .mean (distances_row [mask ])
205
+ return a
206
+
207
+ >> >> >> > reverted the comment
166
208
167
209
distances = pairwise_distances (X , metric = metric , ** kwds )
168
210
unique_labels = le .classes_
@@ -200,4 +242,4 @@ def silhouette_samples(X, labels, metric='euclidean', **kwds):
200
242
201
243
sil_samples = inter_clust_dists - intra_clust_dists
202
244
sil_samples /= np .maximum (intra_clust_dists , inter_clust_dists )
203
- return np .nan_to_num (sil_samples )
245
+ return np .nan_to_num (sil_samples )
0 commit comments