[PYTHON] Versuchen Sie die Clusteranalyse mit K-Mitteln

Was ist Clusteranalyse? Was ist die K-Durchschnittsmethode?

Es ist so.

スクリーンショット 2014-03-19 23.59.06.png

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.

wie kann ich?

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.

  1. Ordnen Sie den Daten x_i zufällig Cluster zu (i = 1 \ ... n).
  2. 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.
  3. Ermitteln Sie den Abstand zwischen jedem x_i und jedem V_j und weisen Sie x_i dem nächsten zentralen Cluster zu.
  4. 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

  1. Streuen Sie die Punkte zufällig. Ich werde sie ohne Grund in Gruppen einteilen.
  2. Finden Sie die Mitte jeder Gruppe.
  3. Die vorherige Gruppierung war angemessen, daher gruppiere ich mich basierend auf der Mitte der nächstgelegenen Gruppe neu.
  4. Wiederholen Sie die Schritte 1 bis 3, bis sich nichts mehr ändert.

Ich denke das ist was es ist.

Versuchte es zu schaffen.

Ja. スクリーンショット 2014-03-19 23.59.06.png

Dies am Anfang. Diesmal habe ich das gemacht.

Quelle

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()

Kommentar

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.

Punkte zufällig streuen und entsprechend gruppieren

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.

Ich suche das Zentrum der Gruppe

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.

Wiederholen

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.

Zusammenfassung

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

Versuchen Sie die Clusteranalyse mit K-Mitteln
Versuchen Sie es mit Jieba, einer chinesischen morphologischen Analyse-Engine
Versuchen Sie es mit Scikit-Learn (1) - K-Clustering nach Durchschnittsmethode
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der PeeringDB 2.0-API
Versuchen Sie es mit dem Python Cmd-Modul
[Erkennung von Anomalien] Versuchen Sie es mit der neuesten Methode des Fernunterrichts
Versuchen Sie es mit der Wunderlist-API in Python
Versuchen Sie es mit dem Webanwendungsframework Flask
Sattelpunktsuche mit der Gradientenmethode
Versuchen Sie, die Kraken-API mit Python zu verwenden
Versuchen Sie es mit dem $ 6 Rabatt LiDAR (Camsense X1)
Versuchen Sie, das HL-Band der Reihe nach zu verwenden
Versuchen Sie, die Kamera mit Pythons OpenCV zu verwenden
Versuchen Sie es mit Tkinter
Verstehen Sie die k-means-Methode
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Versuchen Sie es mit Docker-Py
Verkürzung der Analysezeit von Openpose mithilfe von Sound
Versuchen Sie es mit einem Ausstecher
Versuchen Sie es mit PDFMiner
Versuchen Sie es mit der BitFlyer Ligntning API in Python
Flächenextraktionsmethode mit dem Zellautomaten Versuchen Sie die Flächenextraktion aus dem Bild mit Growcut (Python).
Python: Versuchen Sie, die Benutzeroberfläche von Pythonista 3 auf dem iPad zu verwenden
Versuchen Sie es mit Geopandas
Versuchen Sie es mit Selen
Versuchen Sie es mit scipy
Versuchen Sie es mit dem Python-Webframework Tornado Part 1
Versuchen Sie es vorerst mit LINE Notify
Versuchen Sie es mit pandas.DataFrame
Methode der Regressionsanalyse
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3
Generieren Sie Hash-Werte mit der HMAC-Methode.
Versuchen Sie es mit Django-Swiftbrowser
Versuchen Sie es mit matplotlib
Versuchen Sie es mit dem Python-Webframework Tornado Part 2
Versuchen Sie es mit tf.metrics
Versuchen Sie, die Monte-Carlo-Methode in Python zu implementieren
Versuchen Sie es mit PyODE
Versuchen Sie es mit einer objektorientierten Klasse in R (R6-Methode)
Versuchen Sie, die DropBox Core-API mit Python zu verwenden
Berechnung der kürzesten Route nach der Monte-Carlo-Methode
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 2
Big-Data-Analyse mit dem Datenflusskontroll-Framework Luigi
Bestimmen Sie den Schwellenwert mithilfe der P-Tile-Methode in Python
Versuchen Sie es mit dem Temperatursensor (LM75B) mit Raspeye.
Clustering und Hauptkomponentenanalyse nach der K-Means-Methode (Anfänger)
Ich habe versucht, EKG-Daten mit der K-Shape-Methode zu gruppieren
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 1
Erläuterung des Konzepts der Regressionsanalyse mit Python Extra 1
Versuchen Sie es mit virtualenv (virtualenvwrapper)
[Azure] Versuchen Sie, Azure-Funktionen zu verwenden
Versuchen Sie es jetzt mit virtualenv
Versuchen Sie es mit W & B.
Versuchen Sie es mit Django templates.html
[Kaggle] Versuchen Sie es mit LGBM