用 k-means方法对下面的数据进行分类,k=3,要求用java写代码 怎么做

用 k-means方法对下面的数据进行分类,k=3,要求用java写代码 怎么做,第1张

第一次迭代下,除了a4点,其他点都归为一类c1:(a1 a2 a3 a5)c2:(a4) 聚类册春中心:c1:(2,2)c2(5,4)(聚类中心的计算方式是平均类州者耐中所有点)

第二次迭代下,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)                            //申请分配内存         }     } }


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12293486.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存