isomap演算法 python實現

2021-08-17 16:14:33 字數 2630 閱讀 1428

1:構建鄰接圖g:基於輸入空間x中流形g上的的鄰近點對i,j之間的歐式距離dx (i,j),選取每個樣本點距離最近的k個點(k-isomap)或在樣本點選定半徑為常數ε的圓內所有點為該樣本點的近鄰點,將這些鄰近點用邊連線,將流形g構建為乙個反映鄰近關係的帶權流通圖g;

2:計算所有點對之間的最短路徑:通過計算鄰接圖g上任意兩點之間的最短路徑逼近流形上的測地距離矩陣dg=,最短路徑的實現以floyd或者dijkstra演算法為主。

3:構建k維座標向量:根據圖距離矩陣dg=使用經典mds演算法在d維空間y中構造資料的嵌入座標表示,選擇低維空間y的任意兩個嵌入座標向量yi與yj使得代價函式最小。

下面是python實現的**:

import numpy as np

import matplotlib.pyplot as plt

import sys

def distancematrix(test):

leng=len(test)

resmat=np.zeros([leng,leng],np.float32)

for i in range(leng):

for j in range(leng):

resmat[i,j]=np.linalg.norm(test[i]-test[j])

return resmat #返回距離矩陣

def mds(test,deg):

length= len(test)

re= np.zeros((length, length),np.float32)

if(deg>length):

deg=length

d= distancematrix(test)

ss = 1.0 /length ** 2 * np.sum(d ** 2)

for i in range(length):

for j in range(length):

re[i, j] = -0.5 * (d[i, j] ** 2 - 1.0 / length * np.dot(d[i, :], d[i, :]) - 1.0 / length * np.dot(d[:, j], d[:, j]) + ss)

a, v = np.linalg.eig(re)

list_idx = np.argpartition(a, deg- 1)[-deg:]

a = np.diag(np.maximum(a[list_idx], 0.0))

return np.matmul(v[:, list_idx], np.sqrt(a))

# 使用 dijkstra 演算法獲取最短路徑,並更新距離矩陣

# test: 距離矩陣,大小 m * m

# start:最短路徑的起始點,範圍 0 到 m-1

def usedijk(test, start):

count = len(test)

col= test[start].copy()

rem = count - 1

while rem > 0:

i= np.argpartition(col, 1)[1]

length = test[start][i]

for j in range(count):

if test[start][j] > length + test[i][j]:

test[start][j] = length + test[i][j]

test[j][start] = test[start][j]

rem -= 1

col[i] = float('inf')

# isomap 演算法的具體實現

# test:需要降維的矩陣

# target:目標維度

# k:k 近鄰演算法中的超引數

# return:降維後的矩陣

def isomap(test, target, k):

inf = float('inf')

count = len(test)

if k >= count:

raise valueerror('k is too large')

mat_distance = distancematrix(test)

knear = np.ones([count, count], np.float32) * inf

for idx in range(count):

topk = np.argpartition(mat_distance[idx], k)[:k + 1]

knear[idx][topk] = mat_distance[idx][topk]

for idx in range(count):

usedijk(knear, idx)

return mds(knear, target)

if __name__ == '__main__':

print('開始降維.....')

d =np.array([[1,2,3,4],[2,1,5,6],[3,5,1,7],[4,6,7,1]]) #test data

outcome= isomap(d, 2, 3)

sys.stdout.write('降維完成\n')

print(outcome)

Perona Malik 演算法Python實現

最近正好在學習關於影象處理的東西,需要用到pm perona malik 演算法,所以就把自己的一些理解和 貼上來,希望能跟大家一起 pm演算法的具體原理可以網上查閱相關資料或者相關書籍,這裡只是簡要介紹大概的實現思路 一般而言,對乙個影象進行提取特徵之前,需要進行降噪濾波處理。最常用的應該是高斯濾...

Miller Rabin演算法 Python實現

用python實現了miller rabin的素性檢驗演算法 import random deflargeprime generate bit 1024 print generating large prime.i 1while true num random.randrange 2 bit 1 2...

python 關聯規則演算法 apriori實現

coding utf 8 from future import print function import pandas as pd 自定義連線函式,用於實現l 到c k的連線 def connect string x,ms x list map lambda i sorted i.split ms...