【问题标题】:How do I speed up my RBF kernel function in my k-means algorithm如何在我的 k-means 算法中加速我的 RBF 核函数
【发布时间】:2021-11-24 18:17:34
【问题描述】:

我正在尝试为我的内核 k-means alg 实现 RBF 内核函数。这是我的公式。 然后我用Numpy实现了,但是有两层for循环,我在想怎么把它变成矩阵运算。因为如果我能做矩阵运算,处理我的 784 维数据会快很多。或者也许我的实现不正确?有人可以帮我吗?

import numpy as np

def get_gamma(X, Y):
    gamma = 0
    for x in X:
        for y in Y:
            tmp = x - y
            gamma += tmp**2
    gamma = gamma / (length**2)
    return gamma

def kernel(X, Y, gamma):
    up = np.sum(np.power(X-Y, 2))
    res = np.exp(-*up/gamma)
    return res

def kernel_distance(X, Y):
    gamma = get_gamma(X, Y)
    a = kernel(X, X, gamma)
    b = kernel(Y, Y, gamma)
    c = kernel(X, Y, gamma)
    return np.sqrt(a+b-2*c)

【问题讨论】:

    标签: python numpy machine-learning matrix k-means


    【解决方案1】:

    如果我运行你的代码,它会给我一个 k 的数字,这很奇怪。但它不应该是一个数组吗? XY 也不应该是二维的,因为它们基本上是你的观点列表?无论如何,如果我有自己的XY

    from scipy.spatial.distance import cdist
    import numpy as np
    
    n = 10
    X = np.random.random((n,3))
    Y = np.random.random((n,3))
    

    我可以这样解决你的问题

    norms_sq = cdist(X,Y,'sqeuclidean')
    two_sigma_sq = 1/n**2*np.sum(norms_sq)
    k = np.exp(-norms_sq/two_sigma_sq)
    

    【讨论】:

    • 其实我是想把kernel K Means算法中的Euclidean distance公式改成kernel方法。所以 X 和 Y 都是 n 维向量,我能得到的结果将是一个标量。
    • @jack 你确定吗?通常都是这种情况,并且在您的公式中表明 X 是一个 n x d 矩阵,其中 d 是数据点的维数,n 是数据点的数量。 IE。 X 是您累积所有积分时所获得的。那么内核是一个 n x n 或 n x m 矩阵,其中第 i,j 个元素保存第 i 个和第 j 个向量之间的距离。
    • 是的,我确认。即使使用 rbf 核函数,两点之间的距离也应该是标量。
    • @jack 通常是与内核一起工作的库,例如scikit-learn 期望内核采用我描述的形式,并且也类似于您上面的公式。它是两个输入的标量,但针对所有药水组合预先计算,因此您得到一个矩阵。
    • 我知道你的意思,但我只是想让Kmeans算法在计算样本点和聚类中心点之间的距离时应用RBF核函数。并且两点之间的距离应该是一个数字
    猜你喜欢
    • 2015-10-12
    • 2014-08-18
    • 2019-09-10
    • 2018-03-12
    • 2013-07-03
    • 2018-10-11
    • 2011-07-24
    • 1970-01-01
    • 2012-06-19
    相关资源
    最近更新 更多