Es ist so.
Clusteranalyse: Eine Analyse, bei der ähnliche Daten zusammengefasst werden. K Mittelungsmethode: Eine der Clusteranalysemethoden.
Es gibt verschiedene Anwendungsbereiche, aber das offensichtlichste Beispiel ist Ein Programm, das die auf den Koordinaten verstreuten Punkte miteinander verbindet. Das werde ich diesmal machen.
Laut Wikipedia scheint dies zu tun.
Die K-Mittelungsmethode wird im Allgemeinen im folgenden Ablauf implementiert. Sei n die Anzahl der Daten und K die Anzahl der Cluster.
- Ordnen Sie den Daten x_i zufällig Cluster zu (i = 1 \ ... n).
- Berechnen Sie das Zentrum V_j (j = 1 \ ... K) jedes Clusters basierend auf den zugewiesenen Daten. Die Berechnung verwendet normalerweise den arithmetischen Durchschnitt jedes Elements der zugewiesenen Daten.
- Ermitteln Sie den Abstand zwischen jedem x_i und jedem V_j und weisen Sie x_i dem nächsten zentralen Cluster zu.
- Wenn sich die Zuordnung aller x_i-Cluster im obigen Prozess nicht ändert oder wenn der Änderungsbetrag einen bestimmten voreingestellten Schwellenwert unterschreitet, wird festgestellt, dass der Prozess konvergiert hat und der Prozess endet. Wenn nicht, berechnen Sie V_j aus dem neu zugewiesenen Cluster neu und wiederholen Sie den obigen Vorgang.
Es ist einfach, aber es ist schwierig. Machen
Ich denke das ist was es ist.
Ja.
Dies am Anfang. Diesmal habe ich das gemacht.
Insgesamt 99 Zeilen. Es passt in 100 Zeilen. glücklich. Die Erklärung wird später gegeben.
k-means.py
# -*- coding: utf-8 -*-
import wx
import random
import math
class MyMainWindow(wx.Frame):
def __init__(self, parent=None, id=-1, title=None):
#Panel auf Rahmen setzen
wx.Frame.__init__(self, parent, id, title)
self.panel = wx.Panel(self, size=(300, 300))
self.panel.SetBackgroundColour('000000')
self.Fit()
#Veranstaltung
self.panel.Bind(wx.EVT_PAINT, self.on_paint)
self.panel.Bind(wx.EVT_LEFT_DOWN, self.on_left_click)
self.panel.Bind(wx.EVT_RIGHT_DOWN, self.on_right_click)
#Variable Initialisierung
self.dots = []
self.dc = None
#Es gibt drei Arten von Clustern: Rot, Grün und Blau
self.cluster_types = ('#FF0000', '#00FF00', '#0000FF')
self.clusters = [(0, 0), (0, 0), (0, 0)]
#Anfänglicher Satz von Punkten
self.shuffle_dots()
def on_paint(self, event):
u"""Zeichenereignis"""
self.dc = wx.PaintDC(self.panel)
#Schreibe ein Quadrat
self.dc.SetPen(wx.Pen('#CCCCCC', 1))
for x in range(0, 300, 10):
self.dc.DrawLine(x, 0, x, 300)
for y in range(0, 300, 10):
self.dc.DrawLine(0, y, 300, y)
#Zeichne einen Punkt
for dot in self.dots:
self.dc.SetPen(wx.Pen(self.cluster_types[dot['cluster']], 5))
self.dc.DrawPoint(dot['x'], dot['y'])
#Zeichnen Sie den Schwerpunkt des Clusters.
self.draw_cluster()
def on_left_click(self, evt):
u"""Klicken Sie mit der linken Maustaste, um den Cluster neu zu berechnen"""
self.change_cluster()
self.Refresh()
def on_right_click(self, evt):
u"""Klicken Sie mit der rechten Maustaste, um den Punkt zurückzusetzen"""
self.shuffle_dots()
self.Refresh()
def shuffle_dots(self):
u"""Ordne die Punkte zufällig an."""
self.dots = []
for i in range(30):
self.dots.append({'x': random.randint(0, 300),
'y': random.randint(0, 300),
'cluster': random.randint(0, len(self.cluster_types) - 1)})
def draw_cluster(self):
u"""Zeichnen Sie einen Cluster."""
self.clusters = []
for c in range(len(self.cluster_types)):
#Schwerpunkt des Clusters = Durchschnitt der Koordinaten der zum Cluster gehörenden Punkte
self.dc.SetPen(wx.Pen(self.cluster_types[c], 1))
count = sum(1 for dot in self.dots if dot['cluster'] == c)
x = sum(dot['x'] for dot in self.dots if dot['cluster'] == c) // count if count != 0 else 150
y = sum(dot['y'] for dot in self.dots if dot['cluster'] == c) // count if count != 0 else 150
self.clusters.append({'x': x, 'y': y})
#Zeichnen Sie den Cluster mit einem Kreuz
self.dc.DrawLine(x - 5, y - 5, x + 5, y + 5)
self.dc.DrawLine(x + 5, y - 5, x - 5, y + 5)
#Zeichnen Sie eine Linie vom Cluster zu jedem Punkt.
self.dc.SetPen(wx.Pen(self.cluster_types[c], 0.8))
for dot in self.dots:
if dot['cluster'] == c:
self.dc.DrawLine(x, y, dot['x'], dot['y'])
def change_cluster(self):
u"""Ändern Sie die Zugehörigkeit jedes Punkts zum nächsten Cluster."""
for d in range(len(self.dots)):
near_dist = 99999
#Abstand zwischen zwei Punkten = √( (X1-X2)^2+(Y1-Y2)^2 )
for c in range(len(self.cluster_types)):
dist = math.sqrt(
(self.dots[d]['x'] - self.clusters[c]['x']) ** 2 + (self.dots[d]['y'] - self.clusters[c]['y']) ** 2)
#Wechseln Sie zum nächsten Cluster
if near_dist >= dist:
self.dots[d]['cluster'] = c
near_dist = dist
if __name__ == '__main__':
app = wx.PySimpleApp()
w = MyMainWindow(title='K-Means Test')
w.Center()
w.Show()
app.MainLoop()
wxPython Diesmal habe ich eine GUI-Bibliothek namens wxPython verwendet. Es funktioniert unter Mac, Windows und Linux und zeigt es auf eine Weise an, die jeder Plattform vertraut ist.
class MyMainWindow(wx.Frame):
Erstellen Sie eine Klasse, die wx.Frame
und erbt
if __name__ == '__main__':
app = wx.PySimpleApp()
w = MyMainWindow(title='K-Means Test')
w.Center()
w.Show()
app.MainLoop()
Anruf. Ein solcher Fluss.
Ja. Die eigentliche Logik wird hier erklärt.
shuffle_dots()
Diese Funktion streut die Punkte und fügt sie in ein Array ein, das als Punkte bezeichnet wird.
Zu diesem Zeitpunkt werden Gruppen entsprechend zugewiesen.
draw_cluster()
Der Durchschnitt jedes zur Gruppe gehörenden Punktes wird berechnet und als Mittelpunkt der Gruppe verwendet.
Zeichnen Sie übrigens eine Linie von der Mitte zu jedem Punkt, um das Verständnis zu erleichtern.
change_cluster()
on_paint()
Abstand zwischen zwei Punkten = √ ((X1-X2) ^ 2 + (Y1-Y2) ^ 2) Verwenden Sie diese Formel, um den Abstand zwischen jedem Punkt und dem Mittelpunkt der Gruppe zu ermitteln und zur nächsten Gruppe zu wechseln. Es gab eine solche Formel. Es war zum ersten Mal seit der Junior High School nützlich. Zeichnen auf dem Bildschirm Diese Funktion wird zum Zeitpunkt des Zeichnens aufgerufen. Weil es am Anfang mit "self.panel.Bind (wx.EVT_PAINT, self.on_paint)" verknüpft war. Die Reihenfolge der Erklärung und Verarbeitung hat sich geändert, aber die zuvor erläuterte Verarbeitung wird in dieser Funktion aufgerufen.
Jedes Mal, wenn Sie auf klicken, wird der bisherige Fluss neu berechnet. Wenn Sie mehrmals darauf drücken, wird es in das ausgefüllte Formular eingeteilt. Klicken Sie mit der linken Maustaste, um die Position neu zu positionieren.
Es ist eine Analysemethode, die eine hohe Schwelle zu haben scheint, Wenn ich es tatsächlich versuche, ist es relativ einfach.
Dieses K-Mittelungsverfahren führt jedoch tendenziell zu einem verzerrten Ergebnis Es scheint eine verbesserte Analysemethode zu geben.
Selbst wenn Sie Punkte in die Koordinaten eingeben und in Gruppen unterteilen, ist diese nur leer. Es kann interessant sein, die Ähnlichkeit Ihrer Lieblingstiere zu analysieren, indem Sie die X-Achse dem Katzengeschmack und die Y-Achse dem Hundegeschmack zuweisen.
Ich mag es auch, das Koordinatensystem um zwei zu erhöhen und eine vierdimensionale Clusteranalyse durchzuführen. Es gibt einen Sinn für die Zukunft.
Recommended Posts