<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: suwijak glinrun no18 3/9</title>
    <description>The latest articles on DEV Community by suwijak glinrun no18 3/9 (@suwijak_glinrun1083).</description>
    <link>https://dev.to/suwijak_glinrun1083</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3056244%2F4f9c8f32-5754-4a62-b84b-d8bd97c3de61.png</url>
      <title>DEV Community: suwijak glinrun no18 3/9</title>
      <link>https://dev.to/suwijak_glinrun1083</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suwijak_glinrun1083"/>
    <language>en</language>
    <item>
      <title>บทความ "K-Means Clustering: Clustering Unsupervised Machine Learning"</title>
      <dc:creator>suwijak glinrun no18 3/9</dc:creator>
      <pubDate>Wed, 16 Apr 2025 19:05:05 +0000</pubDate>
      <link>https://dev.to/suwijak_glinrun1083/bthkhwaam-k-means-clustering-clustering-unsupervised-machine-learning-e9p</link>
      <guid>https://dev.to/suwijak_glinrun1083/bthkhwaam-k-means-clustering-clustering-unsupervised-machine-learning-e9p</guid>
      <description>&lt;p&gt;​&lt;/p&gt;

&lt;p&gt;อธิบายแนวคิดและการใช้งานของอัลกอริทึม K-Means Clustering ซึ่งเป็นเทคนิคการเรียนรู้ของเครื่องแบบไม่มีผู้สอน (Unsupervised Learning) ที่ใช้ในการแบ่งกลุ่มข้อมูลที่ไม่มีป้ายกำกับล่วงหน้า &lt;br&gt;
&lt;strong&gt;K-Means Clustering&lt;/strong&gt; คืออะไร?&lt;br&gt;
K-Means Clustering เป็นอัลกอริทึมที่ใช้ในการแบ่งกลุ่มข้อมูล (Clustering) โดยไม่ต้องมีป้ายกำกับ (Label) ล่วงหน้า เป้าหมายคือการจัดกลุ่มข้อมูลที่มีลักษณะคล้ายกันเข้าด้วยกัน โดยกำหนดจำนวนกลุ่มล่วงหน้าเป็นค่า K แต่ละกลุ่มจะมีจุดศูนย์กลาง (Centroid) ซึ่งเป็นค่าเฉลี่ยของข้อมูลในกลุ่มนั้น&lt;/p&gt;
&lt;h3&gt;
  
  
  ขั้นตอนการทำงานของ K-Means Clustering
&lt;/h3&gt;

&lt;p&gt;1.กำหนดค่า K: เลือกจำนวนกลุ่มที่ต้องการแบ่งข้อมูล&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;สุ่มจุดศูนย์กลางเริ่มต้น: สุ่มเลือก K จุดจากข้อมูลเป็นจุดศูนย์กลางเริ่มต้น&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;จัดกลุ่มข้อมูล: คำนวณระยะห่างระหว่างแต่ละจุดข้อมูลกับจุดศูนย์กลาง แล้วจัดกลุ่มข้อมูลให้ใกล้กับจุดศูนย์กลางที่สุด&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;อัปเดตจุดศูนย์กลาง: คำนวณค่าเฉลี่ยของข้อมูลในแต่ละกลุ่มใหม่ เพื่อหาจุดศูนย์กลางใหม่&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ทำซ้ำขั้นตอนที่ 3 และ 4: ทำซ้ำจนกว่าจุดศูนย์กลางจะไม่เปลี่ยนแปลงมากนัก หรือถึงจำนวนรอบที่กำหนด&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;แนวคิดสำคัญใน K-Means Clustering&lt;br&gt;
จุดศูนย์กลาง (Centroid): ตำแหน่งเฉลี่ยของข้อมูลในแต่ละกลุ่ม&lt;/p&gt;

&lt;p&gt;Inertia: ค่าผลรวมของระยะห่างระหว่างจุดข้อมูลกับจุดศูนย์กลางของกลุ่ม ใช้ในการวัดความกระชับของกลุ่ม&lt;/p&gt;

&lt;p&gt;การเลือกค่า K: สามารถใช้วิธี Elbow Method หรือ Silhouette Analysis เพื่อช่วยในการตัดสินใจเลือกจำนวนกลุ่มที่เหมาะสม​&lt;/p&gt;

&lt;p&gt;การใช้งาน K-Means Clustering ด้วย Python&lt;br&gt;
ในบทความมีตัวอย่างการใช้งาน K-Means Clustering ด้วยภาษา Python โดยใช้ไลบรารี scikit-learn &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ตัวอย่างโค้ด Python 1. นำเข้าไลบรารี&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;บล็อกนี้จะนำเข้าไลบรารีที่จำเป็นสำหรับการจัดการและการวางแผนข้อมูล&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. สร้างข้อมูลตัวอย่างที่มี 3 คลัสเตอร์&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;np.random.seed(42)  # For reproducibility
n_samples = 300

# Cluster 1: Centered at (0, 0)
X1 = np.random.randn(n_samples // 3, 2) * 0.5

# Cluster 2: Centered at (3, 3)
X2 = np.random.randn(n_samples // 3, 2) * 0.5 + [3, 3]

# Cluster 3: Centered at (-2, 3)
X3 = np.random.randn(n_samples // 3, 2) * 0.5 + [-2, 3]

# Combine all clusters
X = np.vstack((X1, X2, X3))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;บล็อกนี้สร้างข้อมูลสังเคราะห์สำหรับคลัสเตอร์สามคลัสเตอร์ที่ตั้งอยู่ในพื้นที่ฟีเจอร์ต่างๆ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. ดำเนินการจัดกลุ่ม k-Means&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;n_clusters = 3
kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
cluster_labels = kmeans.fit_predict(X)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;บล็อกนี้จะเริ่มต้นอัลกอริทึม k-Means ด้วยจำนวนคลัสเตอร์ที่ระบุ และปรับให้เข้ากับชุดข้อมูล โดยทำนายป้ายคลัสเตอร์สำหรับจุดข้อมูลแต่ละจุด&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. แสดงภาพผลลัพธ์การจัดกลุ่ม&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plt.figure(figsize=(12, 8))

# Plot the data points
scatter = plt.scatter(X[:, 0], X[:, 1], c=cluster_labels, cmap='viridis', alpha=0.7)

# Plot the cluster centers
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x', s=200, linewidths=3)

plt.title(f'K-means Clustering (k={n_clusters})')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.colorbar(scatter)

# Add text annotations for each cluster
for i, center in enumerate(centers):
    plt.annotate(f'Cluster {i}', center, fontsize=12, fontweight='bold', 
                 xytext=(5, 5), textcoords='offset points')

plt.show()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;บล็อกนี้แสดงภาพผลลัพธ์การจัดกลุ่ม โดยแสดงจุดข้อมูลที่มีสีตามป้ายกำกับกลุ่ม และทำเครื่องหมายจุดศูนย์กลางกลุ่มด้วยสัญลักษณ์ 'X' สีแดง&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ผลลัพท์&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyzzah1ba1o6uxcn11zp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcyzzah1ba1o6uxcn11zp.png" alt="Image description" width="800" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เรามาลองทำเป็นชุดข้อมูลแบบ  วงกลมกัน &lt;br&gt;
&lt;strong&gt;ขั้นตอนที่ 1 เป็นคำสั่งสำหรับ นำเข้า (import)&lt;/strong&gt;&lt;br&gt;
 ฟังก์ชัน make_circles จากไลบรารี scikit-learn make_circles จะใช้สำหรับสร้าง ข้อมูลจำลองที่อยู่เป็นรูปวงกลมซ้อนกัน 2 วง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from sklearn.datasets import make_circles

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 2 สร้างข้อมูลวงกลมซ้อนกัน&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X, y = make_circles(n_samples=300, factor=0.5, noise=0.05)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;อธิบายพารามิเตอร์:&lt;br&gt;
n_samples=300 → สร้างข้อมูลทั้งหมด 300 จุด&lt;/p&gt;

&lt;p&gt;factor=0.5 → กำหนด สัดส่วนของวงในกับวงนอก (วงใน = ครึ่งหนึ่งของวงนอก)&lt;/p&gt;

&lt;p&gt;noise=0.05 → เพิ่มความสุ่มให้กับตำแหน่งจุดเล็กน้อย ทำให้ดูเป็นธรรมชาติ ไม่เรียงสวยเป๊ะ&lt;/p&gt;

&lt;p&gt;ผลลัพธ์:&lt;br&gt;
X → เป็น ข้อมูลตำแหน่งจุด (x, y) ขนาด (300, 2) คือ 300 แถว 2 คอลัมน์&lt;/p&gt;

&lt;p&gt;y → เป็น ป้าย label จริงของจุด (0 หรือ 1) บอกว่าวงไหน (ใช้เพื่อเปรียบเทียบ ไม่ได้ใช้ใน KMeans)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 3 ใช้อัลกอริทึม K-Means เพื่อจัดกลุ่มข้อมูล&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kmeans = KMeans(n_clusters=2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;สร้างโมเดล KMeans จาก sklearn.cluster&lt;/p&gt;

&lt;p&gt;กำหนดให้จัดกลุ่มเป็น 2 กลุ่ม (n_clusters=2) เพราะเรารู้ว่ามี 2 วง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kmeans.fit(X)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ฝึกโมเดล (Train) โดยใช้ข้อมูล X&lt;/p&gt;

&lt;p&gt;KMeans จะพยายามจัดกลุ่มข้อมูลให้ดีที่สุดโดยอิงจากระยะห่างของจุดกับ "จุดศูนย์กลางกลุ่ม" (centroid)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;y_kmeans = kmeans.predict(X)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;หลังฝึกเสร็จ เราให้โมเดล ทำนายว่าจุดแต่ละจุดควรอยู่ในกลุ่มไหน (คลัสเตอร์ที่ 0 หรือ 1)&lt;/p&gt;

&lt;p&gt;ผลลัพธ์ y_kmeans เป็น array ที่บอกว่าแต่ละจุดอยู่กลุ่มไหน (เช่น [1, 0, 1, 0, ...])&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 4แสดงผลการจัดกลุ่มด้วยกราฟ&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ใช้ matplotlib.pyplot ในการสร้าง scatter plot&lt;/p&gt;

&lt;p&gt;X[:, 0] → พิกัดแกน X (ค่าคอลัมน์ที่ 0)&lt;/p&gt;

&lt;p&gt;X[:, 1] → พิกัดแกน Y (ค่าคอลัมน์ที่ 1)&lt;/p&gt;

&lt;p&gt;c=y_kmeans → ระบายสีแต่ละจุดตามกลุ่มที่ KMeans จัดไว้&lt;/p&gt;

&lt;p&gt;s=50 → กำหนดขนาดจุด&lt;/p&gt;

&lt;p&gt;cmap='viridis' → กำหนดชุดสีที่ใช้&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;centers = kmeans.cluster_centers_

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ดึงตำแหน่งของ ศูนย์กลางกลุ่ม (centroid) ที่ KMeans คำนวณได้&lt;/p&gt;

&lt;p&gt;เป็น array ขนาด (2, 2) → เพราะมี 2 กลุ่ม และแต่ละ centroid มี 2 ค่าพิกัด (x, y)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;วาด จุดศูนย์กลางกลุ่ม เป็นสีดำ&lt;/p&gt;

&lt;p&gt;s=200 → ขนาดจุดใหญ่ชัดเจน&lt;/p&gt;

&lt;p&gt;alpha=0.5 → กำหนดความโปร่งใสให้มองเห็นพื้นหลังได้เล็กน้อย&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plt.title("K-Means on Circular Data")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตั้งชื่อกราฟให้ดูสวยงามและสื่อความหมาย&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ขั้นตอนสุดท้าย สั่งให้แสดงผลกราฟทั้งหมดที่วาดไว้&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;plt.show()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ผลลัพท์&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0j9bh3s9tje32tu5syxb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0j9bh3s9tje32tu5syxb.png" alt="Image description" width="692" height="677"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;สรุปสั้น&lt;/strong&gt;&lt;br&gt;
สร้างข้อมูลวงกลมซ้อนกัน&lt;/p&gt;

&lt;p&gt;ใช้ KMeans แบ่งข้อมูลเป็น 2 กลุ่ม&lt;/p&gt;

&lt;p&gt;วาดกราฟแสดงการจัดกลุ่ม พร้อมจุดศูนย์กลางของแต่ละกลุ่ม**&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;สรุป&lt;/strong&gt;&lt;br&gt;
การแสดงภาพผลลัพธ์ของการจัดกลุ่มด้วย K-Means ช่วยให้เราเห็นได้ชัดเจนว่าข้อมูลถูกแบ่งออกเป็นแต่ละคลัสเตอร์อย่างไร ซึ่งช่วยให้เข้าใจโครงสร้างของข้อมูลและรูปแบบการกระจายตัวของแต่ละกลุ่มได้ง่ายขึ้น&lt;/p&gt;

&lt;p&gt;หากคุณทำตามขั้นตอนที่มีโครงสร้างชัดเจน เช่น การเลือกจำนวนคลัสเตอร์ที่เหมาะสม การใช้เครื่องมือสำหรับแสดงภาพ และการวิเคราะห์ผลลัพธ์ คุณก็จะสามารถนำ K-Means ไปใช้กับชุดข้อมูลต่างๆ ได้อย่างมีประสิทธิภาพ และยังได้ข้อมูลเชิงลึกที่เป็นประโยชน์เกี่ยวกับลักษณะพื้นฐานของข้อมูลเหล่านั้นอีกด้วย&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>python</category>
      <category>news</category>
    </item>
  </channel>
</rss>
