当你有这样的数据时,你可以很容易地理解城市之间的相对距离,但看表格毕竟有点麻烦,如果它是可视化的,它将更好地帮助理解具体的信息。

首先是仓库的安装,需要通过pip install或内部安装编译器(如内部安装)pycharm的setting)
import numpy as np import matplotlib.pyplot as plt import math import xlrd # 读取excel的库
然后是数据读取函数
def read_xlsx(): distance_data = [] xlsx_data = xlrd.open_workbook("data.xlsx") table_data = xlsx_data.sheet_by_index(0) # 获取data.xlsx第一张表 for k in range(1, table_data.nrows): # 获取表中所有数据行 line_data = table_data.row_values(k) distance_data.append(line_data) city_name = table_data.row_values(0) # 获取表中第0行的城市名称 return np.array(distance_data), city_name
mds函数
def mds_function(distance, k): m, n = distance.shape # 获取距离矩阵的行数和列数 square_matrix = distance * distance # 距离矩阵平方后获得矩阵 o_matrix = np.zeros((n, n)) # 同阶0矩阵获取 e_matrix = np.eye(n) # 获取同阶单位阵 # 计算内积矩阵 inner_product_matrix = -1 / 2 * \ ((e_matrix - 1 / n * o_matrix) @ square_matrix @ (e_matrix - 1 / n * o_matrix)) eigenvalue, eigenvector = np.linalg.eigh(inner_product_matrix) # 对内积矩阵进行特征分解,获取内积函数的特征值(升序)和特征向量 eigenvector = np.flip(eigenvector, axis=1) # 由于翻转特征向量是按特征值升序排列的 sigma = np.zeros((k, k)) for j in range(1, k 1): sigma[j - 1, j - 1] = math.sqrt(eigenvalue[-j]) return sigma @ eigenvector[:, :k].T
绘图函数
def create_map(data, city): x_axis = -data[1] y_axis = data[0] plt.rcParams['axes.unicode_minus'] = False # 防止负值报错 plt.rcParams['font.sans-serif'] = ['SimHei'] # 防止中文报错 plt.scatter(x_axis, y_axis) for i in range(len(x_axis)): plt.annotate(city[i], xy=(x_axis[i], y_axis[i]), xytext=(x_axis[i] 0.1, y_axis[i] 0.1)) plt.show()
主函数
if __name__ == "__main__": distance_, city_ = read_xlsx() result_data = mds_function(distance_, 2) create_map(result_data, city_)
这样,你就可以得到一个简单的城市距离地图(更抽象)