找到一个轴心点,使;重叠“;由两个python列表组成

找到一个轴心点,使;重叠“;由两个python列表组成,python,math,Python,Math,我有两个Python浮点数列表,我想找到一个使这两个列表的“重叠”最小化的轴心点 下图说明了这个问题,我想得到两条曲线的交叉点(每条曲线都可以想象为列表的直方图),并且“重叠”被定义为绿色区域 例如,我有两个列表[2.1,3.5,3.8,3.8,3.8,4.2]和[3.7,4.1,4.1,4.1,5.0]。好的轴心点可以是4.0(或3.8和4.1之间的任何数字),其中“重叠”仅对应于第一个列表中的一个数字(4.2)和第二个列表中的一个数字(3.7) 显然set()和set()方法在这里不适用,因

我有两个Python浮点数列表,我想找到一个使这两个列表的“重叠”最小化的轴心点

下图说明了这个问题,我想得到两条曲线的交叉点(每条曲线都可以想象为列表的直方图),并且“重叠”被定义为绿色区域

例如,我有两个列表[2.1,3.5,3.8,3.8,3.8,4.2]和[3.7,4.1,4.1,4.1,5.0]。好的轴心点可以是4.0(或3.8和4.1之间的任何数字),其中“重叠”仅对应于第一个列表中的一个数字(4.2)和第二个列表中的一个数字(3.7)

显然set()和set()方法在这里不适用,因为两个列表中的数字不一样。我提出的唯一方法是暴力搜索,从4.2开始,到3.7结束,这并不理想

根据评论,我需要将其分为两个问题: 1) 找到这两个列表的轴心点的Python解决方案是什么? 2) 好得多,也许在这里问得太多了,但是如何得到一个统计上严格的解决方案来最小化两组值的分离呢?我不确定我是否可以假设值的高斯分布,但让我们假设我们可以,如果这有助于制定一个解决方案


如果我理解正确,您要查找的值不一定属于列表。
如果是这种情况,您可以“人为地”使用原始列表的最小值和最大值之间的十进制间距对列表重新采样,将它们转换为“集合”,并计算它们之间的交集

如果我理解正确,您要查找的值不一定属于列表。
如果是这种情况,您可以“人为地”使用原始列表的最小值和最大值之间的十进制间距对列表重新采样,将它们转换为“集合”,并计算它们之间的交集

一个想法是使用决策分类器来确定最佳分离点

代码

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier # Import Decision Tree Classifier
from sklearn.model_selection import train_test_split # Import train_test_split function
from sklearn import metrics #Import scikit-learn metrics module for accuracy calculation

# Setup Data
df = pd.DataFrame({'Feature': [1.0, 2.1, 3.5, 4.2,3.7, 4.1, 5.0],'Label':[0,0,0,0,1,1,1]})

feature_cols = ['Feature']
X = df[feature_cols] # Features
y = df.Label # Target variable

# Create Decision Tree classifer object (use max_depth of 1 to have one boundary)
clf = DecisionTreeClassifier(max_depth = 1)

# Train Decision Tree Classifer
clf = clf.fit(X, y)

# Found decision boundary by creating test data in 0.1 steps from min to max
# (i.e. 1 to 5)
arr = np.arange(1, 5.1, 0.1)
test_set = pd.DataFrame({'Feature': arr})

# Create predictor so we can see where boundary is created
y_pred = clf.predict(test_set)

indexes = np.where(y_pred > 0)   # all points with label 1
pivot_index = indexes[0][0]      # first point with label 1
pivot_value = arr[pivot_index]   # value is pivot value
print(f'Pivot value: {pivot_value}')
输出

Pivot value: 3.7000000000000024

一个想法是使用决策分类器来确定最佳分离点

代码

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier # Import Decision Tree Classifier
from sklearn.model_selection import train_test_split # Import train_test_split function
from sklearn import metrics #Import scikit-learn metrics module for accuracy calculation

# Setup Data
df = pd.DataFrame({'Feature': [1.0, 2.1, 3.5, 4.2,3.7, 4.1, 5.0],'Label':[0,0,0,0,1,1,1]})

feature_cols = ['Feature']
X = df[feature_cols] # Features
y = df.Label # Target variable

# Create Decision Tree classifer object (use max_depth of 1 to have one boundary)
clf = DecisionTreeClassifier(max_depth = 1)

# Train Decision Tree Classifer
clf = clf.fit(X, y)

# Found decision boundary by creating test data in 0.1 steps from min to max
# (i.e. 1 to 5)
arr = np.arange(1, 5.1, 0.1)
test_set = pd.DataFrame({'Feature': arr})

# Create predictor so we can see where boundary is created
y_pred = clf.predict(test_set)

indexes = np.where(y_pred > 0)   # all points with label 1
pivot_index = indexes[0][0]      # first point with label 1
pivot_value = arr[pivot_index]   # value is pivot value
print(f'Pivot value: {pivot_value}')
输出

Pivot value: 3.7000000000000024

我们有两个列表ab。我们正在寻找这样一个值x,其中a中较高值的累积概率等于b中较低值的累积概率

正式:

1− CDF(a,x)=CDF(b,x)
或者:

1− CDF(a,x)− CDF(b,x)=0
让我们用Python实现它

导入itertools
随机输入
def边界(a、b):
“”“返回边界值的间隔。”“”
#计算两个列表的概率密度函数
#合并列表并按其值排序
cc=已排序(itertools.chain(
((x,1/len(a))对于枚举(a)中的i,x),
((x,1/len(b))表示枚举(b)中的i,x)
#用1标记所有值− CDF(a,x)− CDF(b,x)
pp=[(x[0],1-sum(z[1]表示cc中的z[:i+1]))表示枚举(cc)中的i,x]
#查找最接近零的值的索引
m=min(枚举(pp),key=lambda x:abs(x[1][1]))
#返回值的范围
索引=m[0]
返回pp[index][0],pp[index+1][0]
测试简单案例:

打印(边界([1,2],[3,4])#->(2,3)
打印(边界([1],[3])#->(1,3)
打印(边界([1,3],[2,4])#->(2,3)
并测试一个更复杂的情况:

a=sorted(范围(300)内的uu的随机高斯(0,1))
b=排序(随机。高斯(1,1)表示范围(200)内的uuu)
打印(边界(a,b))#->约(0.5,0.5+Δ)
请注意,该算法正确处理不同长度的列表。

通过轻微的性能优化,它可以成功地处理数百万项的列表。

我们有两个列表ab。我们正在寻找这样一个值x,其中a中较高值的累积概率等于b中较低值的累积概率

正式:

1− CDF(a,x)=CDF(b,x)
或者:

1− CDF(a,x)− CDF(b,x)=0
让我们用Python实现它

导入itertools
随机输入
def边界(a、b):
“”“返回边界值的间隔。”“”
#计算两个列表的概率密度函数
#合并列表并按其值排序
cc=已排序(itertools.chain(
((x,1/len(a))对于枚举(a)中的i,x),
((x,1/len(b))表示枚举(b)中的i,x)
#用1标记所有值− CDF(a,x)− CDF(b,x)
pp=[(x[0],1-sum(z[1]表示cc中的z[:i+1]))表示枚举(cc)中的i,x]
#查找最接近零的值的索引
m=min(枚举(pp),key=lambda x:abs(x[1][1]))
#返回值的范围
索引=m[0]
返回pp[index][0],pp[index+1][0]
测试简单案例:

打印(边界([1,2],[3,4])#->(2,3)
打印(边界([1],[3])#->(1,3)
打印(边界([1,3],[2,4])#->(2,3)
并测试一个更复杂的情况:

a=sorted(范围(300)内的uu的随机高斯(0,1))
b=排序(随机。高斯(1,1)表示范围(200)内的uuu)
打印(边界(a,b))#->约(0.5,0.5+Δ)
请注意,该算法正确处理不同长度的列表。
通过轻微的性能优化,它可以成功地处理包含数百万项的列表。

列表是否始终排序(如果没有排序,是否可以排序)?如果是这样,你似乎只有两种可能性来考虑(第一个列表的最后一个元素和最后一个列表的第一个元素)。请定义“枢轴点”。这两个间隔之间的重叠似乎与任何无关的点无关,但是