第二次迭代下,c1(a1 a2 a5)c2(a3 a4) 聚类中心c1:(4/3,5/3)c2(9/2 7/2)
第三次迭代下,c1(a1 a2 a5)c2(a3 a4) 聚类中心c1:(4/3,5/3)c2(9/嫌悉2 7/2)结果已经稳定跳出循环
K-MEANS算法:k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类禅神以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所简袭圆获得一个“中心对象”(引力中心)来进行计算的。
k-means 算法的工作过程说明如下:首先从n个数据对象任意选择 k 个对象作为初始聚类中心;而对于所剩下其它对象,则根据它们与这些聚类中心的相似度(距离),分别将它们分配给与其最相似的(聚类中心所代表的)聚类;然后再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值);不断重复这一过程直到标准测度函数开始收敛为止。一般都采用均方差作为标准测度函数. k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。
具体如下:
输入:k, data[n]
(1) 选择k个初始中心点,例如c[0]=data[0],…c[k-1]=data[k-1]
(拦塌2) 对于data[0]….data[n], 分别与c[0]…c[n-1]比较,假定与c[i]差值最少,就标记为i
(3) 对于所有标记为i点,重新计算c[i]=/标记为i的个数;
(4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值。
算法实现起来应该很容易,就不帮你编写代码了。
java outofmemory是什么,让我们一起了解一下?
out of memory(内存溢出)是一个程序员常见的错误类型,通常是开启应用程序过多所导致。一般是由于电脑内存不足,配置过低,电脑开启的应用程序过多,导致内存不足或者游戏客户端的问题。
Java中OutOfMemoryError(内存溢出)出现的情况和解决办法是什么?
第一种OutOfMemoryError: PermGenspace。
发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与PermanentGeneration space有关。解决这类问题有以下两种办法:
1、增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。如针对tomcat6.0,在catalina.sh或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 增加一行:
JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m" 。
如果是windows服务器还可以在系统环境变量中设置。感觉用tomcat发布sprint+struts+hibernate架构的程序时很容易发生这种内存溢出错误。
2、清理应用程序中web-inf/lib下的jar,如果tomcat部署了多个应用,很多应用都使用了相同的jar,可以将共同的jar移到tomcat共同的lib下,减少类的重复加载。这种方法是网上部分人推荐的,我没试过,但感觉减少不了太大的空间,最靠谱的还是第一种方法。
第二种OutOfMemoryError: Java heap space 。
发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间销察已经用满了,与Heapspace有关。解决这类问题有两种思路:
1、检查程序,看是否有死循环或不必要地重复创建庆斗模大量对象。找到原因后,修改程序和算法。
写一个使用K-Means文本聚类算法对几万条文本记录(每条记录的特征向量大约10来个)进行文本聚类时,由于程序细节上有问题,就导致了Javaheap space的内存溢出问题,后来通过修改程序得到了解决。
2、增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m-Xmx1024m。
实战 *** 作,本机内存溢出代码如下: package DirectMemory import sun.misc.Unsafe import java.lang.reflect.Field /** * VM Args: -Xmx20M -XX:MaxDirectMemorySize=10M * DirectByteBuffer分配内存也会抛出内存溢出异常,但它抛出异常时没有真正向系统申请分配内存,而是通过计算得知内存 * 无法分配,于是手动抛出异常。有点类似 *** 作系统的银行家算法(避免死锁) */ public class DirectMemoryOOM { private static final int _1MB = 1024*1024 public static void main(String[] args) throws IllegalAccessException { Field unsafeField = Unsafe.class.getDeclaredFields()[0] //获取类中第一个变量 unsafeField.setAccessible(true) //设置是否可反射访问private变量 Unsafe unsafe = (Unsafe) unsafeField.get(null) //获取静态对象 while (true){ 誉缓 unsafe.allocateMemory(_1MB) //申请分配内存 } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)