1. مقدمة
تختار خوارزمية التجميع K-mean أولاً كائنات K كمركز تجميع أولي. ثم يتم حساب المسافة بين كل كائن ومركز كل مجموعة بذرة ، ويتم تعيين كل كائن إلى مركز الكتلة الأقرب إليه. يمثل مركز الكتلة والكائنات المخصصة لهم مجموعة. بمجرد تخصيص جميع الكائنات ، يتم إعادة حساب مركز الكتلة لكل مجموعة بناءً على الكائنات الموجودة في الكتلة. سيتم تكرار هذه العملية حتى يتم استيفاء شرط الإنهاء معين. يمكن أن تكون حالة الإنهاء أنه لا يتم إعادة تعيين كائنات (أو الحد الأدنى للرقم) إلى مجموعات مختلفة ، لا تتغير (أو الحد الأدنى للرقم) من مراكز الكتلة مرة أخرى ، ويكون مجموع الأخطاء المربعة ضئيلًا محليًا.
2. ما هو التجميع
التجميع هي عملية لفرز وتنظيم أعضاء البيانات المتشابهة في بعض الجوانب. التجميع هي تقنية لاكتشاف هذا الهيكل الداخلي. غالبًا ما تسمى تكنولوجيا التجميع التعلم غير الخاضع للإشراف.
3. ما هو التجميع K-mean
تجميع K-mean هي أكثر خوارزمية التجميع شهرة ، وبسبب بساطتها وكفاءتها ، أصبحت الأكثر استخدامًا على نطاق واسع في جميع خوارزميات التجميع. بالنظر إلى مجموعة نقطة البيانات والعدد المطلوب من المجموعات K ، يتم تحديد K بواسطة المستخدم ، ويقسم خوارزمية K-Mean مرارًا وتكرارًا إلى مجموعات K وفقًا لوظيفة مسافة معينة.
4. التنفيذ
رمز Java كما يلي:
package org.algorithm ؛ import java.util.arraylist ؛ import java.util.random ؛/*** k-mean خوارزمية المجموعات*/الطبقة العامة kmeans {private int k ؛ // كم عدد المجموعات التي يتم تقسيمها إلى dataSet ، ArrayList <Float []> DataSet ؛ // مجموعة البيانات المرتبطة قائمة ArrayList الخاصة <Float []> Center ؛ // قائمة المرتبطة المركز الخاصة بـ ArrayList <RayList <Float [] param dataSet*/public void setDatAset (ArrayList <float []> dataset) {this.dataset = dataSet ؛}/*** احصل عدد المجموعات ، إذا كان k <= 0 ، تم تعيينه على 1 ، إذا كان k أكبر من طول مصدر البيانات ، فقم بتعيين على طول مصدر البيانات*/الكميون العام (int k) {if (k <= 0) {k = 1 ؛} this.k = k ؛ dataset.size () == 0) {initDatAset () ؛} datasetLength = dataset.size () ؛ if (k> dataSetLength) {k = datasetlength ؛} center = initcenters () ؛ cluster = initCluster () ؛ يتم استخدامه*/private void initDatAset () {dataSet = new ArrayList <float []> () ؛ // حيث {6،3} هو نفسه ، وبالتالي فإن خطأ مجموعات البيانات من الطول 15 إلى 14 مجموعة و 15 مجموعات. 4 ، 2} ، {7 ، 3} ، {6 ، 2} ، {4 ، 7} ، {6 ، 3} ، {5 ، 3} ، {6 ، 3} ، {6 ، 9} ، {1 ، 6} ، {3 ، 9} ، {4 ، 1} ، {8 ، 6}} ؛ {dataset.add (datasetArray [i]) ؛}}/*** قم بتهيئة قائمة ارتباط البيانات المركزية ، وهناك العديد من نقاط المركز التي تنقسم بها المجموعات إلى*** @Return Point Set*/private arraylist <float [] flag ؛ int temp = random.nextInt (dataSetLength) ؛ عشوائي [0] = temp ؛ for (int i = 1 ؛ i <k ؛ i ++) {flag = true ؛ بينما (flag) {temp = random.nextint (dataSetLength) ؛ int j = 0 ؛ // لست متأكدًا من أن الحلقة تسبب j غير قادر على إضافة 1 // (j = 0 ؛ if (temp == عشوائيات [j]) ؛ // { // استراحة؛ // ستر System.out.println ("Test1: Randoms ["+i+"] ="+randoms [i]) ؛ //} // system.out.println () ؛ لـ (int i = 0 ؛ i <k ؛ i ++) {center.add (dataSet.get (عشوائي [i])) ؛ // إنشاء رابط مركز التهيئة} المرجع ؛ = new ArrayList <arraylist <float [] >> () ؛ for (int i = 0 ؛ i <k ؛ i ++) {cluster.add (new ArrayList <float []> ()) ؛} return cluster ؛}/** * احسب المسافة بين نقطتين * * param * point 1 * point * point 2 * {مسافة عائمة = 0.0f ؛ تعويم x = العنصر [0] - المركز [0] ؛ تعويم y = element [1] - المركز [1] int int mindistance (تعويم [] المسافة) {float mindistance = المسافة [0] {minlocation = i ؛}}} return minlocation ؛}/*** core ، ضع العنصر الحالي في الكتلة المتعلقة بمركز المسافة الدنيا*/private void clusterset () {float [] المسافة = new float [k] ؛ من أجل (int i = 0 ؛ المسافة (dataset.get (i) ، center.get (j)) ؛ // system.out.println ("test2:"+"dataset ["+i+"] ، المركز ["+j+"] ، المسافة ="+المسافة [j]) ؛} int minlocation = mindistance (المسافة) System.out.println ("Test3:"+"DataSet ["+i+"] ، minlocation ="+minlocation) ؛ // system.out.println () ؛ cluster.get (minlocation) .add (dataSet.get (i)) ؛ // core ، ضع العنصر الحالي في الكتلة المتعلقة بمركز المسافة الدنيا}/** * Center [0] ؛ float y = element [1] - center [1] ؛ float errsquare = x * x + y * y ؛ return errsquare ؛}/** * حساب مجموع خطأ في طريقة وظيفة المعيار المربع */private void country () {float jcf = 0 ؛ لـ (int i = 0 ؛ i <cluster.size () ؛ i ++) {for (int j = 0 ؛ j <cluster.get (i) .size () ؛ setNewCenter () {for (int i = 0 ؛ i <k ؛ i ++) {int n = cluster.get (i) .size () ؛ if (n! = 0) {float [] newCenter = {0 ، 0} ؛ for (int j = 0 ؛ cluster.get (i) .get (j) [1] ؛} // قم بتعيين newCenter متوسط [0] = NewCenter [0]/ n ؛ newCenter [1] = NewCenter [1]/ n ؛ center.set (i ، newCenter) ؛ printDataarRay (ArrayList <float []> dataArray ، string dataArrayName) {for (int i = 0 ؛ i <dataArray.size () ؛ i ++) {system.out.println ("print:" + dataArrayName + "[" + i + "] = "}") ؛} system.out.println ("======================================= ======================================================== ") ؛}/** * Kmeans خوارزمية طريقة العملية الأساسية */private void kmeans () {init () ؛ // printDataarray (DataSet ، "initDataset") ؛ // printdataarray (مركز ، "initcenter") ؛ // مجموعة حلقة حتى يظل الخطأ دون تغيير بينما (صحيح) {clusterset () ؛ // for (int i = 0 ؛ i <cluster.size () ؛ i ++) // {// printDataarray (cluster.get (i) ، "cluster ["+i+"]") ؛ //} countrule () ؛ // system.out.println ("count:"+"JC ["+m+"] ="+jc.get (m)) ؛ // system.out.println () ؛ // يبقى الخطأ دون تغيير ، يتم الانتهاء من التجميع إذا (m! = 0) {if (jc.get (m) - jc.get (m - 1) == 0) {break ؛}} setNewCenter () ؛ // printdataarray (المركز ، "NewCenter") ؛ M ++ ؛ cluster.clear () ؛ cluster = initCluster () ؛} // system.out.println ("ملاحظة: أوقات التكرار: m ="+m) ؛ // إخراج تكرار}/*** تنفيذ خوارزمية*/public void execute () {long startTime = system.CurrentTimillis () ؛ system.out.println ("kmeans") System.CurrentTimeMillis () ؛ system.out.println ("kmeans تشغيل الوقت =" + (endtime)5. الوصف:
تم العثور على الرمز المحدد عبر الإنترنت ، ويتم إضافة التعليقات وتعديلها جزئيًا وفقًا لفهمك. إذا كان التعليق غير صحيح ، آمل أن أقوم بتصحيحه.
6. اختبار
package org.test ؛ import java.util.arraylist ؛ استيراد org.algorithm.kmeans ؛ فئة عامة kmeanstest {public static void main (string [] args) {// تهيئة كائن kmean وتعيين k إلى 10 كيلومترات k = new Kmeans (10) ؛ erraylist <float ArrayList <float []> () ؛ dataset.add (تعويم جديد [] {1،2}) ؛ dataset.add (تعويم جديد [] {3،3}) ؛ dataset.add (new float [] {3،4}) float [] {8،9}) ؛ dataset.add (عطف جديد [] {4،5}) ؛ dataset.add (عائم جديد [] {6،4}) ؛ dataset.add (new float [] {3،9}) float [] {4،2}) ؛ dataset.add (عطف جديد [] {1،9}) ؛ dataset.add (عائم جديد [] {1،9}) ؛ dataset.add (new float [] {1،9}) float [] {4،2}) ؛ dataset.add (عطف جديد [] {1،9}) ؛ dataset.add (عائم جديد [] {1،9}) ؛ dataset.add (new float [] {1،9}) Float [] {5،9}) ؛ dataset.add (تعويم جديد [] {4،2}) ؛ dataset.add (تعويم جديد [] {1،9}) ؛ dataset.add (new float [] {7،8}) ؛ arraylist نتائج التجميع <arraylist <float [] >> cluster = k.getCluster () ؛ // عرض النتيجة (int i = 0 ؛ i <cluster.size () ؛ i ++) {k.printdataarray (cluster.get (i) ، "cluster ["+i+"]") ؛}}}}}}}ملخص: تم تمرير رمز الاختبار. تم عرض نتائج التجميع ، وتلبية النتائج بشكل أساسي المتطلبات. ما إذا كانت هناك خوارزميات أكثر دقة لا يزال يتعين اكتشافها. يجب استكشاف ممارسات محددة
لخص
ما سبق هو المحتوى الكامل لهذه المقالة حول مثال رمز تنفيذ إصدار Java لخوارزمية التجميع K-mean. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!