一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

計算兩個矩陣之間的歐式距離

 秋水一江 2020-09-11

在我們使用k-NN模型時,需要計算測試集中每一點到訓練集中每一點的歐氏距離,即需要求得兩矩陣之間的歐氏距離。在實現(xiàn)k-NN算法時通常有三種方案,分別是使用兩層循環(huán),使用一層循環(huán)和不使用循環(huán)。

使用兩層循環(huán)

分別對訓練集和測試集中的數(shù)據(jù)進行循環(huán)遍歷,計算每兩個點之間的歐式距離,然后賦值給dist矩陣。此算法沒有經(jīng)過任何優(yōu)化。

num_test = X.shape[0]
    num_train = self.X_train.shape[0]
    dists = np.zeros((num_test, num_train)) 
    for i in xrange(num_test):
      for j in xrange(num_train):
        #####################################################################
        # TODO:                                                             #
        # Compute the l2 distance between the ith test point and the jth    #
        # training point, and store the result in dists[i, j]. You should   #
        # not use a loop over dimension.                                    #
        #####################################################################
        # pass
        dists[i][j] = np.sqrt(np.sum(np.square(X[i] - self.X_train[j])))
        #####################################################################
        #                       END OF YOUR CODE                            #
        #####################################################################
    return dists

使用一層循環(huán)

使用矩陣表示訓練集的數(shù)據(jù),計算測試集中每一點到訓練集矩陣的距離,可以對算法優(yōu)化為只使用一層循環(huán)。

def compute_distances_one_loop(self, X):
    """
    Compute the distance between each test point in X and each training point
    in self.X_train using a single loop over the test data.
    Input / Output: Same as compute_distances_two_loops
    """
    num_test = X.shape[0]
    num_train = self.X_train.shape[0]
    dists = np.zeros((num_test, num_train))
    for i in xrange(num_test):
      #######################################################################
      # TODO:                                                               #
      # Compute the l2 distance between the ith test point and all training #
      # points, and store the result in dists[i, :].                        #
      #######################################################################
      # pass
      dists[i] = np.sqrt(np.sum(np.square(self.X_train - X[i]), axis = 1))
      #######################################################################
      #                         END OF YOUR CODE                            #
      #######################################################################
    return dists

不使用循環(huán)

運算效率最高的算法是將訓練集和測試集都使用矩陣表示,然后使用矩陣運算的方法替代之前的循環(huán)操作。但此操作需要我們對矩陣的運算規(guī)則非常熟悉。接下來著重記錄如何計算兩個矩陣之間的歐式距離。

記錄測試集矩陣P的大小為M*D,訓練集矩陣C的大小為N*D(測試集中共有M個點,每個點為D維特征向量。訓練集中共有N個點,每個點為D維特征向量)
Pi是P的第i行,記Cj是C的第j行
Pi=[Pi1Pi2?PiD]?Cj=[Cj1Cj2?CjD]


首先計算PiCj之間的距離dist(i,j)
d(Pi,Cj)=(Pi1?Cj1)2+(Pi2?Cj2)2+?+(PiD?CjD)2=(Pi12+Pi22+?+PiD2)+(Cj12+Cj22+?+CjD2)?2×(Pi1Cj1+Pi2Cj2+?+PiDCiD)=Pi2+Cj2?2×PiCjT


我們可以推廣到距離矩陣的第i行的計算公式
dist[i]=(Pi2Pi2?Pi2)+(C12C22?CN2)?2×Pi(C1TC2T?CNT)=(Pi2Pi2?Pi2)+(C12C22?CN2)?2×PiCT


繼續(xù)將公式推廣為整個距離矩陣
dist=(P12P12?P12P22P22?P22????PM2PM2?PM2)+(C12C22?CN2C12C22?CN2????C12C22?CN2)?2×PCT

表示為python代碼:

def compute_distances_no_loops(self, X):
    """
    Compute the distance between each test point in X and each training point
    in self.X_train using no explicit loops.

    Input / Output: Same as compute_distances_two_loops
    """
    num_test = X.shape[0]
    num_train = self.X_train.shape[0]
    dists = np.zeros((num_test, num_train)) 
    #########################################################################
    # TODO:                                                                 #
    # Compute the l2 distance between all test points and all training      #
    # points without using any explicit loops, and store the result in      #
    # dists.                                                                #
    #                                                                       #
    # You should implement this function using only basic array operations; #
    # in particular you should not use functions from scipy.                #
    #                                                                       #
    # HINT: Try to formulate the l2 distance using matrix multiplication    #
    #       and two broadcast sums.                                         #
    #########################################################################
    # pass
    dists = np.sqrt(-2*np.dot(X, self.X_train.T) + np.sum(np.square(self.X_train), axis = 1) + np.transpose([np.sum(np.square(X), axis = 1)]))
    #########################################################################
    #                         END OF YOUR CODE                              #
    #########################################################################
    return dists

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    精品人妻一区二区四区| 国产在线小视频你懂的| 欧美日韩综合在线第一页| 久久99这里只精品热在线| 日本一区不卡在线观看| 欧美精品激情视频一区| 人体偷拍一区二区三区| 国产精品国三级国产专不卡| 久久碰国产一区二区三区| 日韩蜜桃一区二区三区| 视频一区中文字幕日韩| 99久久精品久久免费| 免费观看一级欧美大片| 黄色国产自拍在线观看| 日韩精品成区中文字幕| 精品一区二区三区不卡少妇av| 日本加勒比在线播放一区| 国产精品一区日韩欧美| 五月天综合网五月天综合网| 伊人久久五月天综合网| 成人三级视频在线观看不卡| 欧美人妻少妇精品久久性色| 日本黄色高清视频久久| 日韩一级欧美一级久久| 精品国产亚洲区久久露脸| 一区二区三区四区亚洲另类| 黄色av尤物白丝在线播放网址 | 日韩精品视频免费观看| 国产又大又硬又粗又湿| 亚洲中文字幕人妻系列| 国产超薄黑色肉色丝袜| 国产一区二区三区丝袜不卡| 日本特黄特色大片免费观看| 国产精品一区二区有码| a久久天堂国产毛片精品| 久久精品欧美一区二区三不卡| 自拍偷拍一区二区三区| 中字幕一区二区三区久久蜜桃| 精品一区二区三区免费看| 熟女少妇一区二区三区蜜桃| 日韩女优视频国产一区|