Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用dbscan对角度数据进行聚类_Python_Matplotlib_Cluster Analysis_Scikit Learn_Modulo - Fatal编程技术网

Python 使用dbscan对角度数据进行聚类

Python 使用dbscan对角度数据进行聚类,python,matplotlib,cluster-analysis,scikit-learn,modulo,Python,Matplotlib,Cluster Analysis,Scikit Learn,Modulo,我需要以X,Y,Phi的形式对数据点进行聚类。现在我使用DBSCAN(sklearn)。除了一件事之外,聚类是有效的:Phi是角度数据,它是模2*Pi。因此,Phi=0附近的聚类是不正确的。有什么办法可以解决这个问题吗?我找不到一个或自己编一个有效的 谢谢。在傅里叶框架之外,圆边界条件实际上不容易实现 您可以尝试通过将X,Y,Phi替换为X,Y,a*cos(Phi),a*sin(Phi)来重新参数化,其中需要正确选择a>0,这是一种比例因子,以便向2D空间的投影能够按照您在聚类中需要的方式进行。

我需要以X,Y,Phi的形式对数据点进行聚类。现在我使用DBSCAN(sklearn)。除了一件事之外,聚类是有效的:Phi是角度数据,它是模2*Pi。因此,Phi=0附近的聚类是不正确的。有什么办法可以解决这个问题吗?我找不到一个或自己编一个有效的


谢谢。

在傅里叶框架之外,圆边界条件实际上不容易实现

您可以尝试通过将
X,Y,Phi
替换为
X,Y,a*cos(Phi),a*sin(Phi)
来重新参数化,其中需要正确选择
a>0
,这是一种比例因子,以便向2D空间的投影能够按照您在聚类中需要的方式进行。首先检查
a=1
(如果对于纯
Phi
,它工作正常,那么这是一个很好的候选者),然后检查剩余数据的数量级
X,Y

这背后的想法是用相位的“真正的”复杂“含义”取代
Phi
,即
exp(1j*Phi)
,但始终保持其真实性

然后,根据此重新参数化计算距离,例如欧几里德:

dist = ((np.array([X1, Y1, a* np.cos(Phi1), a * np.sin(Phi1)]) - np.array([X2, Y2, a * np.cos(Phi2), a * np.sin(Phi2)])) ** 2).sum()

在将圆边界条件馈送到DBSCAN对象之前,您需要对每一对进行此操作。

在傅里叶框架之外,圆边界条件实际上不容易实现

您可以尝试通过将
X,Y,Phi
替换为
X,Y,a*cos(Phi),a*sin(Phi)
来重新参数化,其中需要正确选择
a>0
,这是一种比例因子,以便向2D空间的投影能够按照您在聚类中需要的方式进行。首先检查
a=1
(如果对于纯
Phi
,它工作正常,那么这是一个很好的候选者),然后检查剩余数据的数量级
X,Y

这背后的想法是用相位的“真正的”复杂“含义”取代
Phi
,即
exp(1j*Phi)
,但始终保持其真实性

然后,根据此重新参数化计算距离,例如欧几里德:

dist = ((np.array([X1, Y1, a* np.cos(Phi1), a * np.sin(Phi1)]) - np.array([X2, Y2, a * np.cos(Phi2), a * np.sin(Phi2)])) ** 2).sum()

在将圆边界条件馈送到DBSCAN对象之前,您需要对每一对进行此操作。

在傅里叶框架之外,圆边界条件实际上不容易实现

您可以尝试通过将
X,Y,Phi
替换为
X,Y,a*cos(Phi),a*sin(Phi)
来重新参数化,其中需要正确选择
a>0
,这是一种比例因子,以便向2D空间的投影能够按照您在聚类中需要的方式进行。首先检查
a=1
(如果对于纯
Phi
,它工作正常,那么这是一个很好的候选者),然后检查剩余数据的数量级
X,Y

这背后的想法是用相位的“真正的”复杂“含义”取代
Phi
,即
exp(1j*Phi)
,但始终保持其真实性

然后,根据此重新参数化计算距离,例如欧几里德:

dist = ((np.array([X1, Y1, a* np.cos(Phi1), a * np.sin(Phi1)]) - np.array([X2, Y2, a * np.cos(Phi2), a * np.sin(Phi2)])) ** 2).sum()

在将圆边界条件馈送到DBSCAN对象之前,您需要对每一对进行此操作。

在傅里叶框架之外,圆边界条件实际上不容易实现

您可以尝试通过将
X,Y,Phi
替换为
X,Y,a*cos(Phi),a*sin(Phi)
来重新参数化,其中需要正确选择
a>0
,这是一种比例因子,以便向2D空间的投影能够按照您在聚类中需要的方式进行。首先检查
a=1
(如果对于纯
Phi
,它工作正常,那么这是一个很好的候选者),然后检查剩余数据的数量级
X,Y

这背后的想法是用相位的“真正的”复杂“含义”取代
Phi
,即
exp(1j*Phi)
,但始终保持其真实性

然后,根据此重新参数化计算距离,例如欧几里德:

dist = ((np.array([X1, Y1, a* np.cos(Phi1), a * np.sin(Phi1)]) - np.array([X2, Y2, a * np.cos(Phi2), a * np.sin(Phi2)])) ** 2).sum()
这是在将每对数据馈送到DBSCAN对象之前对其执行的操作。

DBSCAN可以使用任意距离

因此,首先定义一个距离函数(可能涉及一些三角函数),然后将其作为相似性插入DBSCAN

您可能会使用以下内容:

distance = (x1-x2)**2 + (y1-y1)**2 + factor * sin(phi1-phi2)**2
但是你需要仔细选择你的重量
系数
,因为我想角度差与
X
Y
轴的比例不同

出于显而易见的原因,不要在此数据集上使用欧几里德距离。

DBSCAN可以处理任意距离

因此,首先定义一个距离函数(可能涉及一些三角函数),然后将其作为相似性插入DBSCAN

您可能会使用以下内容:

distance = (x1-x2)**2 + (y1-y1)**2 + factor * sin(phi1-phi2)**2
但是你需要仔细选择你的重量
系数
,因为我想角度差与
X
Y
轴的比例不同

出于显而易见的原因,不要在此数据集上使用欧几里德距离。

DBSCAN可以处理任意距离

因此,首先定义一个距离函数(可能涉及一些三角函数),然后将其作为相似性插入DBSCAN

您可能会使用以下内容:

distance = (x1-x2)**2 + (y1-y1)**2 + factor * sin(phi1-phi2)**2
但是你需要仔细选择你的重量
系数
,因为我想角度差与
X
Y
轴的比例不同

出于显而易见的原因,不要在此数据集上使用欧几里德距离。

DBSCAN可以处理任意距离

因此,首先定义一个距离函数(可能涉及一些三角函数),然后将其作为相似性插入DBSCAN

您可能会使用以下内容:

distance = (x1-x2)**2 + (y1-y1)**2 + factor * sin(phi1-phi2)**2
但是你需要仔细选择你的体重
系数
,因为角度差与你的
X
不同