Optics算法.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Optics 算法
- 资源描述:
-
1 什么是OPTICS算法 在前面介绍的DBSCAN算法中,有两个初始参数E(邻域半径)和minPts(E邻域最小点数)需要用户手动设置输入,并且聚类的类簇结果对这两个参数的取值非常敏感,不同的取值将产生不同的聚类结果,其实这也是大多数其他需要初始化参数聚类算法的弊端。 为了克服DBSCAN算法这一缺点,提出了OPTICS算法(Ordering Points to identify the clustering structure)。OPTICS并不显示的产生结果类簇,而是为聚类分析生成一个增广的簇排序(比如,以可达距离为纵轴,样本点输出次序为横轴的坐标图),这个排序代表了各样本点基于密度的聚类结构。它包含的信息等价于从一个广泛的参数设置所获得的基于密度的聚类,换句话说,从这个排序中可以得到基于任何参数E和minPts的DBSCAN算法的聚类结果。 2 OPTICS两个概念 核心距离: 对象p的核心距离是指是p成为核心对象的最小E’。如果p不是核心对象,那么p的核心距离没有任何意义。 可达距离: 对象q到对象p的可达距离是指p的核心距离和p与q之间欧几里得距离之间的较大值。如果p不是核心对象,p和q之间的可达距离没有意义。 例如:假设邻域半径E=2, minPts=3,存在点A(2,3),B(2,4),C(1,4),D(1,3),E(2,2),F(3,2) 点A为核心对象,在A的E领域中有点{A,B,C,D,E,F},其中A的核心距离为E’=1,因为在点A的E’邻域中有点{A,B,D,E}>3; 点F到核心对象点A的可达距离为,因为A到F的欧几里得距离,大于点A的核心距离1. 3 算法描述 OPTICS算法额外存储了每个对象的核心距离和可达距离。基于OPTICS产生的排序信息来提取类簇。 算法描述如下: 算法:OPTICS 输入:样本集D, 邻域半径E, 给定点在E领域内成为核心对象的最小领域点数MinPts 输出:具有可达距离信息的样本点输出排序 方法:1 创建两个队列,有序队列和结果队列。(有序队列用来存储核心对象及其该核心对象的直接可达对象,并按可达距离升序排列;结果队列用来存储样本点的输出次 序); 2 如果所有样本集D中所有点都处理完毕,则算法结束。否则,选择一个未处理(即不在结果队列中)且为核心对象的样本点,找到其所有直接密度可达样本点,如过该样本点不存在于结果队列中,则将其放入有序队列中,并按可达距离排序; 3 如果有序队列为空,则跳至步骤2,否则,从有序队列中取出第一个样本点(即可达距离最小的样本点)进行拓展,并将取出的样本点保存至结果队列中,如果它不存在结果队列当中的话。 3.1 判断该拓展点是否是核心对象,如果不是,回到步骤3,否则找到该拓展点所有的直接密度可达点; 3.2 判断该直接密度可达样本点是否已经存在结果队列,是则不处理,否则下一步; 3.2 如果有序队列中已经存在该直接密度可达点,如果此时新的可达距离小于旧的可达距离,则用新可达距离取代旧可达距离,有序队列重新排序; 3.3 如果有序队列中不存在该直接密度可达样本点,则插入该点,并对有序队列重新排序; 4 算法结束,输出结果队列中的有序样本点。 大家或许会很疑惑,这里不也有输入参数E和MinPts吗?其实这里的E和MinPts只是起到算法辅助作用,也就是说E和MinPts的细微变化并不会影响到样本点的相对输出顺序,这对我们分析聚类结果是没有任何影响。 我们采用与先前DBSCAN相同的样本点集合, 对于样本点 a={2,3};b={2,4};c={1,4};d={1,3};e={2,2};f={3,2}; g={8,7};h={8,6};i={7,7};j={7,6};k={8,5}; l={100,2};//孤立点 m={8,20};n={8,19};o={7,18};p={7,17};q={8,21}; 并且使用相同的E=2 MinPts=4时,输出序列为 1->a:1.0 2->e:1.0 3->b:1.0 4->d:1.0 5->c:1.4142135623730951 6->f:1.4142135623730951 ------ 7->g:1.4142135623730951 8->j:1.4142135623730951 9->k:1.4142135623730951 10->i:1.4142135623730951 11->h:1.4142135623730951 ------ 12->n:2.0 13->q:2.0 14->o:2.0 15->m:2.0 如图,按照算法,分三个阶段输出了三波值 {a,e,b,d,c,f} ,{g,j,k,I,h},{n,q,o,m} 这和DBSCAN的类簇结果是一样的。不仅如此,我们通过分析有序图还能直接得到当参数E=1.5,minPts=4时DBSCAN的类簇结果,只要在坐标图中找到Y值小于1.5的样本点即可,只有两类{a,e,b,d,c,f} ,{g,j,k,I,h},其他点被认为是孤立点,和DBSCAN聚类算法取E=1.5,minPts=4时的结果一致。 所以说,这个OPTICS聚类算法所得的簇排序信息等价于一个广泛的参数设置所获得的基于密度的聚类结果。 具体实现算法如下: package com.optics; public class DataPoint { private String name; // 样本点名 private double dimensioin[]; // 样本点的维度 private double coreDistance; //核心距离,如果该点不是核心对象,则距离为-1 private double reachableDistance; //可达距离 public DataPoint(){ } public DataPoint(DataPoint e){ this.name=e.name; this.dimensioin=e.dimensioin; this.coreDistance=e.coreDistance; this.reachableDistance=e.reachableDistance; } public DataPoint(double dimensioin[],String name){ this.name=name; this.dimensioin=dimensioin; this.coreDistance=-1; this.reachableDistance=-1; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double[] getDimensioin() { return dimensioin; } public void setDimensioin(double[] dimensioin) { this.dimensioin = dimensioin; } public double getCoreDistance() { return coreDistance; } public void setCoreDistance(double coreDistance) { this.coreDistance = coreDistance; } public double getReachableDistance() { return reachableDistance; } public void setReachableDistance(double reachableDistance) { this.reachableDistance = reachableDistance; } } package com.optics; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class ClusterAnalysis { class ComparatorDp implements Comparator<DataPoint>{ public int compare(DataPoint arg0, DataPoint arg1) { double temp=arg0.getReachableDistance()-arg1.getReachableDistance(); int a = 0; if (temp < 0) { a = -1; } else { a = 1; } return a; } } public List<DataPoint> startAnalysis(List<DataPoint> dataPoints, double radius, int ObjectNum) { List<DataPoint> dpList = new ArrayList<DataPoint>(); List<DataPoint> dpQue = new ArrayList<DataPoint>(); int total = 0; while (total < dataPoints.size()) { if (isContainedInList(dataPoints.get(total), dpList) == -1 ) { List<DataPoint> tmpDpList = isKeyAndReturnObjects(dataPoints.get(total), dataPoints, radius, ObjectNum); if(tmpDpList != null && tmpDpList.size() > 0){ DataPoint newDataPoint=new DataPoint(dataPoints.get(total)); dpQue.add(newDataPoint); } } while (!dpQue.isEmpty()) { DataPoint tempDpfromQ = dpQue.remove(0); DataPoint newDataPoint=new DataPoint(tempDpfromQ); dpList.add(newDataPoint); List<DataPoint> tempDpList = isKeyAndReturnObjects(tempDpfromQ, dataPoints, radius, ObjectNum); System.out.println(newDataPoint.getName()+":"+newDataPoint.getReachableDistance()); if (tempDpList != null && tempDpList.size() > 0) { for (int i = 0; i < tempDpList.size(); i++) { DataPoint tempDpfromList = tempDpList.get(i); int indexInList = isContainedInList(tempDpfromList, dpList); int indexInQ = isContainedInList(tempDpfromList, dpQue); if (indexInList == -1) { if (indexInQ > -1) { int index = -1; for (DataPoint dataPoint : dpQue) { index++; if (index == indexInQ) { if (dataPoint.getReachableDistance() > tempDpfromList .getReachableDistance()) { dataPoint .setReachableDistance(tempDpfromList .getReachableDistance()); } } } } else { dpQue.add(new DataPoint(tempDpfromList)); } } } // TODO:对Q进行重新排序 Collections.sort(dpQue, new ComparatorDp()); } } System.out.println("------"); total++; } return dpList; } public void displayDataPoints(List<DataPoint> dps){ for(DataPoint dp: dps){ System.out.println(dp.getName()+":"+dp.getReachableDistance()); } } private int isContainedInList(DataPoint dp, List<DataPoint> dpList) { int index = -1; for (DataPoint dataPoint : dpList) { index++; if (dataPoint.getName().equals(dp.getName())) { return index; } } return -1; } private List<DataPoint> isKeyAndReturnObjects(DataPoint dataPoint,List<DataPoint> dataPoints,double radius,int ObjectNum){ List<DataPoint> arrivableObjects=new ArrayList<DataPoint>(); //用来存储所有直接密度可达对象 List<Double> distances=new ArrayList<Double>(); //欧几里得距离 double coreDistance; //核心距离 for (int i = 0; i < dataPoints.size(); i++) { DataPoint dp = dataPoints.get(i); double distance = getDistance(dataPoint, dp); if (distance <= radius) { distances.add(distance); arrivableObjects.add(dp); } } if(arrivableObjects.size()>=ObjectNum){ List<Double> newDistances=new ArrayList<Double>(distances); Collections.sort(distances); coreDistance=distances.get(ObjectNum-1); for(int j=0;j<arrivableObjects.size();j++){ if (coreDistance > newDistances.get(j)) { if(newDistances.get(j)==0){ dataPoint.setReachableDistance(coreDistance); } arrivableObjects.get(j).setReachableDistance(coreDistance); }else{ arrivableObjects.get(j).setReachableDistance(newDistances.get(j)); } } return arrivableObjects; } return null; } private double getDistance(DataPoint dp1,DataPoint dp2){ double distance=0.0; double[] dim1=dp1.getDimensioin(); double[] dim2=dp2.getDimensioin(); if(dim1.length==dim2.length){ for(int i=0;i<dim1.length;i++){ double temp=Math.pow((dim1[i]-dim2[i]), 2); distance=distance+temp; } distance=Math.pow(distance, 0.5); return distance; } return distance; } public static void main(String[] args){ ArrayList<DataPoint> dpoints = new ArrayList<DataPoint>(); double[] a={2,3}; double[] b={2,4}; double[] c={1,4}; double[] d={1,3}; double[] e={2,2}; double[] f={3,2}; double[] g={8,7}; double[] h={8,6}; double[] i={7,7}; double[] j={7,6}; double[] k={8,5}; double[] l={100,2};//孤立点 double[] m={8,20}; double[] n={8,19}; double[] o={7,18}; double[] p={7,17}; double[] q={8,21}; dpoints.add(new DataPoint(a,"a")); dpoints.add(new DataPoint(b,"b")); dpoints.add(new DataPoint(c,"c")); dpoints.add(new DataPoint(d,"d")); dpoints.add(new DataPoint(e,"e")); dpoints.add(new DataPoint(f,"f")); dpoints.add(new DataPoint(g,"g")); dpoints.add(new DataPoint(h,"h")); dpoints.add(new DataPoint(i,"i")); dpoints.add(new DataPoint(j,"j")); dpoints.add(new DataPoint(k,"k")); dpoints.add(new DataPoint(l,"l")); dpoints.add(new DataPoint(m,"m")); dpoints.add(new DataPoint(n,"n")); dpoints.add(new DataPoint(o,"o")); dpoints.add(new DataPoint(p,"p")); dpoints.add(new DataPoint(q,"q")); ClusterAnalysis ca=new ClusterAnalysis(); List<DataPoint> dps=ca.startAnalysis(dpoints, 2, 4); ca.displayDataPoints(dps); } }展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




Optics算法.doc



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/5963690.html