数据挖掘 k-means离群点检测

k-means离群点检测

改写一种简单的半监督方法,用于离群点检测。使用一种你熟悉的程序设计语言,如C++或Java,实现该方法,并在两种不同的数据集上进行讨论(1)只有一些被标记的正常对象;(2)只有一些被标记的离群点实例。

一、数据集介绍

1、Iris数据集介绍
iris以鸢尾花的特征作为数据来源,数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性,是在数据挖掘、数据分类中非常常用的测试集、训练集。
三类分别为:setosa, versicolor, virginica。
数据包含4个独立的属性,这些属性变量测量植物的花朵,比如萼片和花瓣的长度等。
2、wine数据集介绍
这份数据集包含来自3种不同起源的葡萄酒的共178条记录。13个属性是葡萄酒的13种化学成分。通过化学分析可以来推断葡萄酒的起源。值得一提的是所有属性变量都是连续变量。数据集特征:多变量;记录数:178;领域:物理;属性特征:整数,实数;属性数目:13。
3、abalone数据集介绍
采用UCI数据集中的abalone数据集进行测试。该数据集包括涉及生活领域的8个类别的4177个数据对象,其中含有1个分类型属性,1个整数型属性和6个实数型属性。分类属性数据对象中含有1528个记录为F(父)值,1307个记录为M(母)值,还有1342个记录为I(未成年人)值。

二、算法描述

K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
2.1算法思路
K-means算法
先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是以下任何一个:
1)没有(或最小数目)对象被重新分配给不同的聚类。
2)没有(或最小数目)聚类中心再发生变化。
3)误差平方和局部最小。
2.2算法步骤
a.从数据集中随机挑K个数据当簇心;
b.对数据中的所有点求到这K个簇心的距离,假如点Pi离簇心Si最近,那么Pi属于Si对应的簇;
c.根据每个簇的数据,更新簇心,使得簇心位于簇的中心;
d.重复步骤e和步骤f,直到簇心不再移动(或其他条件,如前后两次距离和不超过特定值),继续下一步;
e.计算每个簇的正常半径,即阀值(此程序阀值为每个簇的平均距离与1.5倍标准差之和);
f.从每个簇中,找出大于阀值的点,即离群点。
三、java 实现
这里写图片描述

package kmeans;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Kmeans {

    /**
     * @param args
     * @throws IOException
     */

    public static List<ArrayList<ArrayList<Double>>> 
    initHelpCenterList(List<ArrayList<ArrayList<Double>>> helpCenterList,int k){
        for(int i=0;i<k;i++){
            helpCenterList.add(new ArrayList<ArrayList<Double>>());
        }   
        return helpCenterList;
    }

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException{

        List<ArrayList<Double>> centers = new ArrayList<ArrayList<Double>>();
        List<ArrayList<Double>> newCenters = new ArrayList<ArrayList<Double>>();
        List<ArrayList<ArrayList<Double>>> helpCenterList = new ArrayList<ArrayList<ArrayList<Double>>>();

        //读入原始数据
        BufferedReader br=new BufferedReader(new In
### 回答1: 可以使用点云配准算法将多个激光雷达扫描的点云数据进行配准,然后将配准后的点云数据转换为栅格地图。具体的方法包括:将点云数据进行滤波、分割、聚类等预处理操作,然后使用栅格化算法将点云数据转换为栅格地图。最后,可以使用地图匹配算法将机器人在栅格地图上的位置进行估计和更新。 ### 回答2: 利用激光雷达点云数据建立栅格地图是通过将三维点云数据转化为二维栅格地图来实现的。下面是具体的步骤: 1. 数据预处理:在建立栅格地图之前,需要对激光雷达点云进行一些预处理,如去除离群点、滤除地面点等。去除离群点可以通过统计每个点的邻域点的平均距离,通过比较与阈的差异来确定是否为离群点。滤除地面点可以通过平面拟合算法来实现。 2. 栅格划分:将整个区域划分为一定大小的栅格,可以根据需要调整栅格的大小,通常是正方形或矩形。 3. 点云投影:将激光雷达点云中的每个点投影到所在的栅格中。可以通过计算点到栅格边界的最小距离来确定点所在的栅格。 4. 栅格更新:根据点云数据的信息更新每个栅格中的。可以根据需要选择更新的方式,如只更新栅格是否被占用、栅格是响应强度还是距离等。 5. 地图生成:根据栅格中的信息生成栅格地图,可以使用不同的颜色或灰度表示不同的属性,如占用栅格和自由栅格等。 得注意的是,在建立栅格地图的过程中,需要考虑激光雷达的分辨率、栅格的大小和更新频率等因素。此外,对于大规模的场景,如果点云密度较高,可以考虑使用分块处理的方法,将整个区域划分为多个子区域来处理,以减少计算量。 总的来说,利用激光雷达点云数据建立栅格地图是一种常用的方法,可以为机器人导航、环境建模等应用提供基础数据。 ### 回答3: 激光雷达点云数据可以通过一系列步骤来建立栅格地图。首先,需要对点云数据进行预处理。这包括去除离群点、滤除地面点和提取感兴趣的对象等。其次,需要对点云数据进行地面分割,将地面点和非地面点分开。这可以通过利用地面的平面特征进行分割,例如RANSAC算法。接下来,需要对非地面点进行聚类,将相邻的点归为同一类。这可以通过基于密度的聚类算法(如DBSCAN)来实现。然后,可以根据点云数据生成栅格地图。对于每个栅格,在点云中找到位于该栅格内的点,并将它们的位置信息用来表示栅格地图中的障碍物。最后,可以将栅格地图进行反馈优化,填充栅格地图中的空洞,并去除栅格地图中的噪声。这可以通过使用滤波和插等技术来实现。通过以上步骤,激光雷达点云数据可以成功建立栅格地图,以实现对环境的感知和导航。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值