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