最小化曼哈顿距离

曼哈顿距离

曼哈顿距离和欧式距离一样是一种距离度量标准,不同的是它定义在L1范数下,也即用绝对值来衡量两点之间的距离。在一维空间下,曼哈顿距离定义如下:
d ( x , y ) = ∣ x − y ∣ d(x,y)=|x-y| d(x,y)=xy
在二维空间下,曼哈顿距离定义如下:
d ( x , y ) = ∣ x 1 − y 1 ∣ + ∣ x 2 − y 2 ∣ d(x,y)=|x_1-y_1|+|x_2-y_2| d(x,y)=x1y1+x2y2
类似的,我们可以获得在n维空间下的曼哈顿距离定义。

最小化一维曼哈顿距离

有了距离定义之后,我们看一个有趣的问题:给定n个一维空间下的点,求使 ∑ ∣ x i − a ∣ \sum{|x_i-a|} xia最小的点 a a a。针对该问题我们有明确的答案: a a a的取值就是 n n n个点的中位数。在quora上有一个比较浅显易懂的解释:在笔直的公路上种了n颗树,假设我们从中间颗树的位置开始往两个方向走,我们会发现不管往哪个方向走,我们都距离至少n/2颗树越来越远,而距离至多n/2颗树越来越近,所以上述距离总是在变大,从而说明使上述距离最小的点是中位数。下面给出数学证明:
我们假定使上述距离最小的点可以出现在数轴任意位置,既可以是n个点中的任意一个,也可以不属于n个点,我们分这两张情况讨论:

  1. 假设n个点已排序,选择第k个点计算距离,则有
    在这里插入图片描述
    同理,选择第k+1个点计算距离,则有
    在这里插入图片描述
    我们想知道当k逐渐变大时,距离的变化趋势,所以我们将上述两个距离做差
    在这里插入图片描述
    由于我们已经将n个点排序,所以 x k − x k + 1 x_k-x_{k+1} xkxk+1始终小于等于0,当k小于等于n/2时,2k-n小于等于0,从而上式大于等于0;当k大于等于n/2时,2k-n大于等于0,从而上式小于等于0。这表明随着k逐渐增大,距离先变小再变大,在k=n/2时取得最小值。具体的,当n=2k为偶数时,上式在k和k+1位置处相等并取得最小值;当n=2k+1为奇数时,上式在k+1位置处取得最小值,此时即是中位数。将奇偶两种情况统一考虑,在k+1也即n/2+1位置处我们可以获得距离最小值。
  2. 假设使距离最小的点不是给定的n个点,则最优位置可以是数轴上的任意位置。很显然的,首先可以将n个数确定范围之外的区间都排除掉,也即最优点既不可能小于n个点中的最小值也不可能大于n个点中的最大值。这样剩余需要考虑的最优点就可能是n个点之间的小区间。我们研究一下曼哈顿距离在这段区间上的变化趋势。选择任意一段区间 x k &lt; c 1 &lt; c 2 &lt; x k + 1 x_k&lt;c_1&lt;c_2&lt;x_{k+1} xk<c1<c2<xk+1,重新计算
    在这里插入图片描述
    从上面的公式我们可以看出,当k小于等于n/2时,距离公式满足 d ( x k ) &gt; d ( c 1 ) &gt; d ( c 2 ) &gt; d ( x k + 1 ) d(x_k)&gt;d(c_1)&gt;d(c_2)&gt;d(x_{k+1}) d(xk)>d(c1)>d(c2)>d(xk+1),当k大于等于n/2时, d ( x k ) &lt; d ( c 1 ) &lt; d ( c 2 ) &lt; d ( x k + 1 ) d(x_k)&lt;d(c_1)&lt;d(c_2)&lt;d(x_{k+1}) d(xk)<d(c1)<d(c2)<d(xk+1)。也即在整个连续空间上距离先减后增。从而当n=2k为偶数时,区间 [ x n / 2 , x n / 2 + 1 ] [x_{n/2},x_{n/2+1}] [xn/2,xn/2+1]之间的任意数均可以取得最小值,当我们取 ( x n / 2 + x n / 2 + 1 ) / 2 (x_{n/2}+x_{n/2+1})/2 (xn/2+xn/2+1)/2时即表示中位数;当n=2k+1为奇数时,距离在k+1位置处取得最小值,此时还是中位数。
    通过对离散和连续两种情况的考虑,我们可以得到结论:使上述公式取最小值的元素为中位数,不过我们可以统一选择排序之后的第n/2+1个元素,奇偶均如此。

最小化高维曼哈顿距离

由于在高维曼哈顿距离中只有加法操作,所以我们可以将每个维度分开考虑,在每个维度上分别按照一维的情况求排序后的第n/2+1个元素,然后组合起来即是最小化的高维曼哈顿距离。

最小化带权曼哈顿距离

有时我们还会遇到比上面更复杂的情况:每个点除了坐标 x i x_i xi还都附带一个权重 w i w_i wi,求使 ∑ w i ∣ x i − a ∣ \sum{w_i|x_i-a|} wixia最小的点 a a a。在此我们也给出推导过程,看看使距离最小的点在什么位置。在上面的证明中我们分离散和连续两种情况考虑,在此我们直接考虑n个点确定的连续区间。假定给n个点已排序,给定点c满足 x k ≤ c &lt; x k + 1 x_k \leq c&lt;x_{k+1} xkc<xk+1我们求
在这里插入图片描述
通过推导我们发现,影响距离变化的因素只是受制于权重,更确切地说是受制于前半部分权重和与后半部分权重和的差值。当 ∑ i = 1 k w i &lt; ∑ i = k + 1 n w i \displaystyle \sum^{k}_{i=1}{w_i}&lt; \sum^{n}_{i=k+1}{w_i} i=1kwi<i=k+1nwi时, d ( c ) &gt; d ( x k + 1 ) d(c)&gt;d(x_{k+1}) d(c)>d(xk+1),此时距离在连续区间上逐渐变小;当 ∑ i = 1 k w i &gt; ∑ i = k + 1 n w i \displaystyle \sum^{k}_{i=1}{w_i}&gt;\sum^{n}_{i=k+1}{w_i} i=1kwi>i=k+1nwi时, d ( c ) &lt; d ( x k + 1 ) d(c)&lt;d(x_{k+1}) d(c)<d(xk+1),距离在连续区间上又开始逐渐变大。所以使距离最小的位置k满足 ∑ i = 1 k − 1 w i &lt; ∑ i = k n w i \displaystyle \sum^{k-1}_{i=1}{w_i}&lt; \sum^{n}_{i=k}{w_i} i=1k1wi<i=knwi并且 ∑ i = 1 k w i ≥ ∑ i = k + 1 n w i \displaystyle \sum^{k}_{i=1}{w_i} \geq \sum^{n}_{i=k+1}{w_i} i=1kwii=k+1nwi,含义就是前半部分权重和原本小于后半部分权重和,加上下一个位置的权重之后大小关系发生转变的位置。所以针对带权曼哈顿距离,我们需要做的就是将n个点排序,然后累加权重直到左侧权重大于右侧权重停止,此时就是使距离最小的位置。特别地,当n个点的权重均为正,且和为1时,分界点就是累加之后权重之和超过0.5的位置,这个位置被称为带权中位数(详细定义请参考算法导论)。
可以看出不管曼哈顿距离是否带权重,使距离最小的位置总是和中位数相关。希望上面的推导能有助于大家理解最小化曼哈顿距离。

  • 15
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: `cmplot` 是一个 Python 数据可视化库,可以使用它来绘制曼哈顿图。曼哈顿图也称为曼哈顿距离图,是一种用于可视化二维数据的图表,其中 x 轴和 y 轴分别表示两个特征,点的位置表示两个特征的值,颜色或大小表示第三个特征的值。 下面是一个使用 `cmplot` 绘制曼哈顿图的示例代码: ```python import seaborn as sns import pandas as pd # 加载数据集 tips = sns.load_dataset('tips') # 绘制曼哈顿图 sns.set(style='white', font_scale=1.2) g = sns.relplot(x='total_bill', y='tip', col='sex', hue='smoker', size='size', data=tips, sizes=(15, 200), palette='viridis', alpha=0.8, height=6, aspect=0.8, facet_kws=dict(sharex=False, sharey=False)) g.fig.suptitle('Manhattan Plot of Tips Dataset', y=1.05) g.set_xlabels('Total Bill') g.set_ylabels('Tip') ``` 这段代码用 `sns.relplot` 函数绘制曼哈顿图,其中 `x` 和 `y` 参数分别指定 x 轴和 y 轴的特征名称,`col` 参数指定分组变量,`hue` 参数指定颜色变量,`size` 参数指定大小变量。`sizes` 参数指定点的最小和最大大小,`palette` 参数指定颜色映射,`alpha` 参数指定透明度,`height` 和 `aspect` 参数指定图形的大小和长宽比。`facet_kws` 参数指定是否共享 x 轴和 y 轴。 最后,使用 `g.fig.suptitle`、`g.set_xlabels` 和 `g.set_ylabels` 函数添加图形标题和轴标签。 ### 回答2: cmplot是一个用于绘制条件均值图的Python库。它可以用来比较不同组别的均值,并显示其置信区间。要绘制曼哈顿图,首先需要安装cmplot库。 使用cmplot绘制曼哈顿图的步骤如下: 1. 导入所需的库和数据。 ```python import pandas as pd import seaborn as sns import cmplot # 导入数据 data = pd.read_csv('data.csv') ``` 2. 创建一个cmplot对象并设置绘图参数。 ```python cp = cmplot.CMPlot(data=data, x='Group', y='Value', hue='Condition', legend_title='Condition', ci='sd') ``` 在这里,data参数是数据集,x参数是组别的列名,y参数是要比较的数值变量的列名,hue参数是根据哪个条件进行分组的列名,legend_title参数是条件标签的标题,ci参数是置信区间的类型,可以使用'sd'表示标准差。 3. 使用cmplot对象绘制曼哈顿图。 ```python cp.cmplot() ``` 这个命令将绘制曼哈顿图,并显示不同组别的均值及其置信区间。 4. 调整图形的其他属性。 可以使用其他seaborn和matplotlib的函数来调整图形的各种属性,比如调整坐标轴标签、标题、颜色、图例等。 ```python cp.set_labels(xlabel='Group', ylabel='Value') cp.set_title('Manhattan Plot') cp.set_palette('Set1') cp.add_legend() ``` 5. 显示图形。 最后使用`plt.show()`命令来显示绘制好的曼哈顿图。 ```python plt.show() ``` 以上是使用cmplot库绘制曼哈顿图的基本步骤。根据具体的数据和需求,你可以根据需要进一步调整图形的显示样式。 ### 回答3: cmplot是一个用于绘制曼哈顿图的Python包。曼哈顿图是一种用于可视化基因组关联的图形方法,它展示了基因组上的关联区域和SNP(单核苷酸多态性)位点之间的联系。 要使用cmplot绘制曼哈顿图,可以按照以下步骤进行: 1. 首先,导入所需的包和数据。使用import语句导入cmplot包,并准备好包含SNP位点和关联统计量的数据。通常,这些数据可以是一个包含染色体、位点位置和p值等信息的数据框。 2. 创建一个曼哈顿图对象。使用cmplot中的ManhattanPlot函数创建一个曼哈顿图对象,并指定x轴和y轴上的数据。x轴通常是SNP的位置,而y轴是关联统计量的负对数p值。 3. 可选地,对曼哈顿图进行个性化设置。根据需要,可以对曼哈顿图进行个性化的设置。例如,可以指定曼哈顿图的标题、轴标签、颜色等。 4. 显示曼哈顿图。使用Matplotlib中的plt.show()函数显示生成的曼哈顿图。 以下是一个示例代码: ```python import cmplot import pandas as pd import matplotlib.pyplot as plt # 导入数据 data = pd.read_csv('data.csv') # 创建曼哈顿图对象 manhattan_plot = cmplot.ManhattanPlot(data['chromosome'], data['position'], -1 * pd.np.log10(data['p_value'])) # 设置曼哈顿图个性化设置(可选) manhattan_plot.set_title('Manhattan Plot') manhattan_plot.set_x_label('Chromosome') manhattan_plot.set_y_label('-log10(p-value)') # 显示曼哈顿图 plt.show() ``` 以上代码演示了如何使用cmplot绘制曼哈顿图。根据您的数据和个性化设置,可能需要调整和修改代码以满足您的需求。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值