问题描述
我的任务是将Parzen窗口与径向基函数内核一起使用,以确定要赋予给定点的标签。
我的训练数据集有4个维度(每点4个特征)。 我的训练标签集包含我的训练集中(这是一维数组)中所有点的标签(可以为0、1、2,...,具体取决于我们拥有的班级数量)。 我的测试数据集包含几个具有4维的点,但是没有标签,所以它是一个nx4数组。
我们有兴趣为测试数据集中的每个点提供标签。
我首先计算rdf内核$ k(x_i,x)$ :(使用python和numpy)
for (i,ex) in enumerate(test_data):
squared_distances = (np.sum((np.abs(ex - self.train_inputs)) ** 2,axis=1)) ** (1.0 / 2)
k = np.exp(- squared_distances/2*(np.square(self.sigma)))
我们假设test_data
看起来像这样:
[[ 0.40614 1.3492 -1.4501 -0.55949]
[ -1.3887 -4.8773 6.4774 0.34179]
[ -3.7503 -13.4586 17.5932 -2.7771 ]
[ -3.5637 -8.3827 12.393 -1.2823 ]
[ -2.5419 -0.65804 2.6842 1.1952 ]]
[ 0.40614 1.3492 -1.4501 -0.55949]
self.train_inputs
是训练数据集,看起来像这样
[[ 3.6216 8.6661 -2.8073 -0.44699]
[ 4.5459 8.1674 -2.4586 -1.4621 ]
[ 3.866 -2.6383 1.9242 0.10645]
...
[-1.1667 -1.4237 2.9241 0.66119]
[-2.8391 -6.63 10.4849 -0.42113]
[-4.5046 -5.8126 10.8867 -0.52846]]
k
是一个数组,其中包含每个x_i(在self.training_inputs中)与我们当前的测试点x(在代码中为ex
)之间的所有距离。
k = [0.99837982 0.9983832 0.99874063 ... 0.9988909 0.99706044 0.99698724]
它的长度与self.train_inputs
中的点数相同。
我对径向基函数的理解是,训练点距测试点越近,k值(当前训练点,测试点)越大。但是k
不能超过1或小于0。
因此,目标是选择最接近测试点的训练点。我们通过查看哪个在k
中具有最大的价值来做到这一点。然后我们获取其索引,并在仅包含标签的数组上使用相同的索引。因此,我们得到了我们希望测试点采用的标签。
在代码中,它转换为此代码(附加代码位于上面的第一个代码段的下方):
best_arg = np.argmax(k) #selects the greatest value in k and gives back its index.
classes_pred[i] = self.train_labels[best_arg] #we use the index to select the label in the train labels array.
self.train_labels
如下:
[0. 0. 0. ... 1. 1. 1.]
此方法适用于ex = [ 0.40614 1.3492 -1.4501 -0.55949]
和k = [0.99837982 0.9983832 0.99874063 ... 0.9988909 0.99706044 0.99698724]
:
818
表示包含当前k
中最大值的索引,而1.
作为给定self.train_labels[818] = 1.
的标签
但是,似乎我做错了。考虑到我的老师已经实施的算法,我会弄错一些标签(尤其是当我们有两个以上的班级时)。我的问题是我做错了吗?如果是,在哪里?我是机器学习的新手。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)