选择最接近SVM双翼飞机的5个数据点

use*_*576 4 python machine-learning svm

我使用Sklearn编写了Python代码来聚类我的数据集:

af = AffinityPropagation().fit(X)
cluster_centers_indices = af.cluster_centers_indices_
labels = af.labels_
n_clusters_= len(cluster_centers_indices)
Run Code Online (Sandbox Code Playgroud)

我正在探索使用群集查询,因此通过以下方式形成初始训练数据集:

td_title =[]
td_abstract = []
td_y= []
for each in centers:
    td_title.append(title[each])
    td_abstract.append(abstract[each])
    td_y.append(y[each])
Run Code Online (Sandbox Code Playgroud)

然后,我通过以下方式训练我的模型(SVM):

clf = svm.SVC()
clf.fit(X, data_y)
Run Code Online (Sandbox Code Playgroud)

我希望编写一个函数,给定中心,模型,X值和Y值将附加模型最不确定的5个数据点,即.最接近超平面的数据点.我怎样才能做到这一点?

Kev*_*vin 5

您的过程的第一步对我来说并不完全清楚,但这里建议"选择最接近SVM超平面的5个数据点".scikit文档定义decision_function为样本到分离超平面的距离.该方法返回一个数组,该数组可以进行排序argsort以找到"顶部/底部N个样本".

此基本scikit示例之后,定义一个函数closestN以返回最接近超平面的样本.

import numpy as np

def closestN(X_array, n):
    # array of sample distances to the hyperplane
    dists = clf.decision_function(X_array)
    # absolute distance to hyperplane
    absdists = np.abs(dists)

    return absdists.argsort()[:n]
Run Code Online (Sandbox Code Playgroud)

将这两行添加到scikit示例中以查看已实现的功能:

closest_samples = closestN(X, 5)
plt.scatter(X[closest_samples][:, 0], X[closest_samples][:, 1], color='yellow')
Run Code Online (Sandbox Code Playgroud)

原版的

在此输入图像描述

最近的样本突出显示

在此输入图像描述

如果您需要将样本附加到某个列表,您可以somelist.append(closestN(X, 5)).如果您需要样本值,您可以执行类似的操作somelist.append(X[closestN(X, 5)]).

closestN(X, 5)
array([ 1, 20, 14, 31, 24])

X[closestN(X, 5)]
array([[-1.02126202,  0.2408932 ],
       [ 0.95144703,  0.57998206],
       [-0.46722079, -0.53064123],
       [ 1.18685372,  0.2737174 ],
       [ 0.38610215,  1.78725972]])
Run Code Online (Sandbox Code Playgroud)