机器学习 --- 等度量映射

第1关:等度量映射

# -*- coding: utf-8 -*-
import numpy as np

def isomap(data, d, k, Max=10000):
    '''
    input:
        data(ndarray): 待降维数据
        d(int): 降维后数据维数
        k(int): 最近的k个样本
        Max(int): 表示无穷大
    output:
        Z(ndarray): 降维后的数据
    '''
    # 计算dist2, dist2i, dist2j, dist2ij
    m, n = data.shape
    dist = np.ones((m, m)) * Max
    disti = np.zeros(m)
    distj = np.zeros(m)
    B = np.zeros((m, m))
    
    for i in range(m):
        distance = np.power(np.tile(data[i], (m, 1)) - data, 2).sum(axis=1)
        index = np.argsort(distance)
        q = index[:k]
        for l in q:
            dist[i][l] = np.power(data[i] - data[l], 2).sum()

    for i in range(m):
        disti[i] = np.mean(dist[i, :])
        distj[i] = np.mean(dist[:, i])
        
    distij = np.mean(dist)
    
    # 计算B
    for i in range(m):
        for j in range(m):
            B[i, j] = -0.5 * (dist[i, j] - disti[i] - distj[j] + distij)
    
    # 矩阵分解得到特征值与特征向量
    lamda, V = np.linalg.eigh(B)
    
    # 计算Z
    index = np.argsort(-lamda)[:d]
    diag_lamda = np.sqrt(np.diag(-np.sort(-lamda)[:d]))
    V_selected = V[:, index]
    Z = V_selected.dot(diag_lamda)
    
    return Z

第2关:sklearn中的等度量映射

# -*- coding: utf-8 -*-
from sklearn.manifold import Isomap

def isomap(data,d,k):
    '''
    input:data(ndarray):待降维数据
          d(int):降维后数据维度
          k(int):最近的k个样本
    output:Z(ndarray):降维后数据
    '''
    #********* Begin *********#
    isomap = Isomap(n_components=d, n_neighbors=k)
    Z = isomap.fit_transform(data)
    #********* End *********#
    return Z

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值