CPD(Coherent Point Drift)相干点漂移算法 python 扩展库使用

一、CPD算法原理

1.点集配准

点集配准是将两个两个点集对其的空间变换过程。简单来说就是有两个点集,二维的三维的或者高维的点集。它们是对同一个物体或者广泛的说是对某种事物的呈现,但由于视角不同等原因,两个点集并不相同。就好像我们人站在不同的角度透视的观察一个物体,不同的角度看到的不一样,因为我们看到的特征之间的相对位置关系并不一样,但我们仍能认出这个物体来,是因为特征没有变。实际在应用角度来讲,就是有两个数据点集(二维的,三维的或者高维的),把其中一个作为参照,把另一个点集中的点的位置往对应的点的位置不断靠近。当然两个数据集的点的数量可能不一样。而CPD算法就是这样的一个过程,最终得到的输出是变换后的点集。

2.CPD算法

这个东东的原理我确实没看懂,概率论学得太差,不懂,不做解释。大家如果有需要的话可以去看一下论文(并不是很推荐,除非数学逆天,不然就是浪费时间)论文链接

二、CPD算法pyton软件包使用

1.pycpd安装

CPD算法本来是有matlab的软件包的。但确实也不好找,我之前找了半天也没找到。然后就想着看看python版本有没有,果然就被我找到了。这个给大家说一下如何找python扩展库,PyPI,直接搜索就可找到这个网站。里面有各种python的扩展库。这里放一下链接here.然后里面搜索CPD(cpd)就可以找到了。里面有一个 pycpd 的扩展库,直接pip install pycpd 就可以了。

2.pycpd使用

在PyPI网站里面给出了这个开源项目的github地址,里面有教程如何使用,以及全部的源代码。link

pycpd 里面有主要几个不同的类:
AffineRegistration(仿射)
DeformableRegistraion(可变性)
RigidRegistration(刚性变换)
分别对应不同类型的匹配。

然后主要有一个register函数,返回要得到的结果

def register(self,callback=lambda **kwargs: None):
	'''
	省略许多代码
	'''
	return self.TY, self.get_registration_parameters()

其中TY就是返回的变换点集的结果,是一个点集。
而get_registration_parameters()返回的则是完成这一变换的参数。不同的类有不同返回结果。
下面是RigidRegistration类get_registration_parameters()源代码

'''
    R: numpy array (semi-positive definite)
        DxD rotation matrix. Any well behaved matrix will do,
        since the next estimate is a rotation matrix.

    t: numpy array
        1xD initial translation vector.

    s: float (positive)
        scaling parameter. 
'''
def get_registration_parameters(self):
        """
        Return the current estimate of the rigid transformation parameters.

        """
        return self.s, self.R, self.t

R是旋转矩阵,t是转换向量,s是缩放参数。
但我没理解算法,所以也不知道这些参数是干嘛的。

然后是一个简单的示例(github里面有数据,我就是用的他的数据):

import matplotlib.pyplot as plt
import pycpd
import numpy as np

X = np.loadtxt('../data/bunny_source.txt')
Y = np.loadtxt('../data/bunny_target.txt')
fig = plt.figure()
ax = fig.gca(projection="3d")
ax.scatter(X[:,0],X[:,1],X[:,2])
ax.scatter(Y[:,0],Y[:,1],Y[:,2])
plt.show()

结果如下,实际上这个两个兔子,分别在坐标轴的不同位置。
结果如下,实际上这个两个兔子,分别在坐标轴的不同位置。
下面分别绘制X,和Y

fig = plt.figure()
ax = fig.gca(projection="3d")
ax.scatter(x[:,0],x[:,1],x[:,2])

请添加图片描述

fig = plt.figure()
ax = fig.gca(projection="3d")
ax.scatter(Y[:,0],Y[:,1],Y[:,2])

请添加图片描述
可以看到X和Y的的形状一模一样,只是位置不同。

reg =pypd.RigidRegistration(**{'X': X, 'Y': Y})
data,(s,r,t) = reg.register()

以X点集作为基准,把Y点集往X点集变换,data为最终得到的结果。
下面绘制data点集

fig = plt.figure()
ax = fig.gca(projection="3d")
ax.scatter(data[:,0],data[:,1],data[:,2])

请添加图片描述
可以看到data点集描绘的形状也是兔子,而且在坐标轴上的位置几乎和X一模一样。
下面我们开看一下具体的数据

    print("X\n",X)
    print("data\n",data)

在这里插入图片描述
可以看到每个点都很接近。

    ax = fig.gca(projection="3d")
    ax.scatter(X[:,0],X[:,1],X[:,2])
    ax.scatter(data[:, 0],data[:, 1],data[:, 2])
    plt.show()

请添加图片描述
可以看到两个点集几乎重叠在一起了。

下面返回的几个参数(我也不懂)

data,(s,R,t) = reg.register(callback)
    print('s: ',s)
    print('R:\n',R)
    print('t:\n',t)

在这里插入图片描述

三、总结

大概这就是pycpd的基本使用方法,还有一点要说明的是,就是github的例子里面有一个可是化的函数,直观的显示了这个变化的过程,感觉很直观,大家可以去看一下。

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
相干漂移算法(Concept Drift Detection Algorithm)是一种用于监督学习的算法,用于检测数据中的概念漂移。概念漂移指的是数据的统计特性随时间发生变化,导致模型在新数据上的性能下降。 在 Python 中,可以使用以下来实现相干漂移算法: 1. scikit-multiflow: 这个提供了多个数据流挖掘算法的实现,包括相干漂移算法。你可以使用 `DriftDetectionMethod` 类来检测概念漂移。具体的使用方法可以参考该的文档和示例代码。 2. River: 这是一个用于在线机器学习Python ,提供了多种数据流挖掘算法的实现。你可以使用 `ADWIN` 或 `DDM` 类来实现相干漂移的检测。这个也有详细的文档和示例代码可供参考。 下面是一个使用 scikit-multiflow 实现相干漂移检测的简单示例: ```python from skmultiflow.drift_detection import DDM import numpy as np # 创建相干漂移检测器 ddm = DDM() # 模拟数据流 np.random.seed(0) data_stream = np.random.randint(0, 2, size=1000) # 逐步处理数据并检测漂移 for i in range(len(data_stream)): data = data_stream[i] drift_status = ddm.add_element(data) # 如果检测到漂移,输出漂移的位置 if drift_status: print(f"漂移检测到:第 {i} 个数据") ``` 这只是一个简单的示例,你可以根据自己的具体需求进行参数设置和算法选择。记得根据你的数据和问题进行适当调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值