机器学习 --- 多维缩放

第1关:多维缩放

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

def mds(data,d):
    '''
    input:data(ndarray):待降维数据
          d(int):降维后数据维数
    output:Z(ndarray):降维后的数据
    '''
    #********* Begin *********#
    #计算dist2,dist2i,dist2j,dist2ij

    #计算B

    #矩阵分解得到特征值与特征向量

    #计算Z
    n = data.shape[0]  # 数据点个数

    # 计算距离矩阵
    dist2 = np.zeros((n, n))  # 初始化距离矩阵
    for i in range(n):
        for j in range(i+1, n):  # 因为距离矩阵是对称矩阵,只需要计算上三角部分
            dist2[i, j] = np.sum((data[i] - data[j]) ** 2)  # 计算欧氏距离的平方
            dist2[j, i] = dist2[i, j]  # 距离矩阵是对称矩阵

    # 根据距离矩阵计算内积矩阵B
    H = np.eye(n) - np.ones((n, n)) / n  # 中心矩阵
    B = -0.5 * H.dot(dist2).dot(H)  # 计算内积矩阵B

    # 对内积矩阵B进行特征值分解
    eigen_values, eigen_vectors = np.linalg.eigh(B)

    # 根据特征值和特征向量进行降维
    idx = np.argsort(eigen_values)[::-1]  # 对特征值从大到小排序
    eigen_values = eigen_values[idx]
    eigen_vectors = eigen_vectors[:, idx]
    Z = eigen_vectors[:, :d] * np.sqrt(eigen_values[:d])  # 降维后的数据

    #********* End *********#
    return Z 

第2关:sklearn中的多维缩放

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

def mds(data,d):
    '''
    input:data(ndarray):待降维数据
          d(int):降维后数据维度
    output:Z(ndarray):降维后数据
    '''
    #********* Begin *********#
    mds = MDS(n_components=d)
    Z = mds.fit_transform(data)
    #********* End *********#
    return Z

你可能感兴趣的:(机器学习,人工智能)