svm.fit报错,IndexError: tuple index out of range

在做AndrewNG机器学习的课后题6时,使用guassian kernel的时候出现了错误
IndexError: tuple index out of range
stackoverflow中看到了同样的问题,尝试之后仍然不对。
查到一个有说,x只是一个一维数组,调用x.shape[1]时会报这个错误,自己测试了一下,确实是这样。但是我的写的guassian kernel会事先将其转换成列向量。而且!我前面选linear kernel时,fit是没有问题的,我还专门输出了一下当时的数据shape,[53,2],使用guassian kernel时数据是[1...,2], 应该不是纬度不匹配的问题吧,我猜测是自己写的callback有问题。代码如下
guassianKernel

# 高斯核函数计算
def GuassianKernel(x, l,sigma=2):
    x = x.reshape((-1,1))
    l = l.reshape((-1,1))
    fz = x - l
    fz = np.sum(np.power(fz,2))
    fm = 2 * sigma * sigma
    return np.array([np.exp(-1 * fz / fm)])

经过测试之后,该函数数值计算结果是正确的

img

错误代码段

img

img

根据你提供的代码和错误信息,这个问题可能的原因是:

  1. x 和 l 在传入GuassianKernel函数时,其中一个可能是1维数组,而不是2维数组。GuassianKernel函数内部对它们做了reshape,但如果原数组就是1维的,那么reshape后取得的shape会是(n,1),而不是(n,1)。这样在后续计算中就会引发index out of range的错误。
  2. sigma的值可能有问题。sigma值太小会使高斯核的值变得非常尖锐,数值计算时容易出错。通常sigma取默认值2就可以了。
    所以可以检查下这两个方面:
  3. 打印出x和l的shape,确保它们在传入GuassianKernel之前就是2维数组,不是1维数组
  4. 尝试将sigma的值设为2,不要取太小的值
    如果问题仍未解决,可以把核函数计算的细节过程打印出来,比如fz和fm的值,看看在具体哪一步产生了不正确的结果。
    最后,为了避免shape问题,可以不必在核函数里显式reshape,直接保证调用时x和l就是2维数组即可。
    python
    def GuassianKernel(x, l, sigma=2):
    fz = x - l
    fz = np.sum(np.power(fz,2))
    fm = 2 * sigma * sigma
    return np.exp(-1 * fz / fm)
    希望这些建议可以帮助你Debug这个问题!