三维点云处理(三)——Kenerl PCA


前言

上一章节说明的基础PCA主成分分析的基本原理,这种PCA主要适用于线性关系的数据点,在原理里包含的矩阵乘法实际上也是线性操作。数据中矩阵乘一个向量就是对矩阵的列的线性组合。如果我们遇到数据不是线性的情况下怎么办呢?

1.1 关于Kernel PCA

在这里插入图片描述
如上图所示的 一批点,如果给他做线性PCA时无法区分开红色和绿色的点,也就达不到聚类的效果,所以在解决非线性相关的数据时,我们应该用升维的方法 。比方说将上图里的数据点,我们将其放置于一个平面上,再从三维空间的角度将平面折叠起来成一个圆锥的话,就可以很好的将红点和绿点区分开来。这时候做一个普通的PCA就可以进行聚类了。
在这里插入图片描述
于是我们引出了kernel PCA的概念,他的步骤就是将原来n₀维度的数据给提升成n₁,得到一个函数ɸ,将中心值变为0,计算其矩阵H的相关矩阵,加上波浪线之后和原来的矩阵区分开,下一步解他们的特征值和特征向量,下面就引申出来两个问题:

  1. 如何去选择升维函数ɸ?
  2. 如果避免升维过高而产生的过高算力,以节省运算资源。

由此我们得到了kernel PCA的方法。证明如下:
在这里插入图片描述
在这里插入图片描述
将Hz=λz代入,得到结论:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
得到如下的式子,通过Kα = λα替换进去,代表αr应该有一个1/λr的长度,得到一个仍然含有ɸ的式子,我们最终目标是要去掉ɸ,在后续的变换中,将所有的ɸ都变换为核函数k,只需要定义一个核函数k即可。之前我们假设了高维空间的中心点为0,需要进行一个Normalization。
在这里插入图片描述
最后将所有的变换回到核函数上去:
在这里插入图片描述
在这里插入图片描述
这里有很多核函数形式,还包括高斯和拉普拉斯分布等,通常会通过数据实验来评估使用效果。

1.2 用法总结

在这里插入图片描述
将所有的数据点投影到主向量上去,由此得到投影后的系数yr。

1.3 Kernel PCA实例

在这里插入图片描述
在这里插入图片描述
图一为三个不同数据点组成的圆,我们选取一个简单的二次多项式的核函数,就可以计算出不同的主成分,将原来的数据投影到主向量上面,x轴为第一个主向量,y轴为第一个主向量。就已经可以将数据明显区分开来。
再使用高斯核函数来验证一下:
在这里插入图片描述
横轴为第一个主成分,竖轴为第二个主成分,此时已经可以区分开不同数据点这就是高维空间以及核PCA的用法。


总结

从PCA引入到kernel PCA,主要是通过使用核函数来对数据进行升维来达成聚类效果。而核PCA的中心思想就是将高维空间的运算转换成低维空间的核函数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android TV 上获取蓝牙键值并将其传递给内核,您需要执行以下步骤: 1. 在 Android TV 上设置蓝牙配对设备。 2. 创建一个 BroadcastReceiver 以接收蓝牙键值。 3. 在 BroadcastReceiver 中处理蓝牙键值,并将其传递给内核。 以下是一个示例 BroadcastReceiver: ```java public class BluetoothReceiver extends BroadcastReceiver { private static final String TAG = "BluetoothReceiver"; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); switch (state) { case BluetoothAdapter.STATE_OFF: Log.d(TAG, "Bluetooth off"); break; case BluetoothAdapter.STATE_TURNING_OFF: Log.d(TAG, "Turning Bluetooth off..."); break; case BluetoothAdapter.STATE_ON: Log.d(TAG, "Bluetooth on"); break; case BluetoothAdapter.STATE_TURNING_ON: Log.d(TAG, "Turning Bluetooth on..."); break; } } else if (BluetoothDevice.ACTION_KEY_EVENT.equals(action)) { int keyCode = intent.getIntExtra(BluetoothDevice.EXTRA_KEY_CODE, -1); if (keyCode != -1) { // Do something with the key code, such as pass it to the kernel } } } } ``` 您需要将此 BroadcastReceiver 注册到您的 Android TV 应用程序中,并使用 IntentFilter 指定要接收的蓝牙广播。例如,您可以在 onCreate() 方法中注册 BroadcastReceiver: ```java IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); filter.addAction(BluetoothDevice.ACTION_KEY_EVENT); registerReceiver(new BluetoothReceiver(), filter); ``` 在 BroadcastReceiver 中,您可以处理蓝牙键值并将其传递给内核。为了将键值传递给内核,您需要使用 JNI 调用 C 函数,并将键值作为参数传递。例如: ```java public class MyNativeLibrary { static { System.loadLibrary("my_native_library"); } public static native void sendKeyEvent(int keyCode); } ``` 您需要在您的 C 代码中实现 sendKeyEvent() 函数,以便它能够将键值传递给内核。例如: ```c JNIEXPORT void JNICALL Java_com_example_MyNativeLibrary_sendKeyEvent(JNIEnv *env, jobject obj, jint keyCode) { // Send key event to kernel } ``` 这是一个简单的示例,您需要根据您的特定用例进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值