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...