Модели классификаторов

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Модели классификаторов

Непрочитанное сообщение Olej » 09 янв 2019, 11:49

Это касается любых распознавателей образов: как классифицировать распознанный образ между некоторыми классами, некоторыми эталонными образцами?
Первый приходящий на ум ответ:
- к какому эталонному образцу распознаваемый ближе, в выбранной метрике оценивания, к тому классу что и образец и принадлежит объект.

Ответ неверный.
И вот картинка (правильного распознавания):
- здесь эталоны 2-х классов (размечены цветом);
- каждый из 2-х классифицируемых объектов ближе (по метрике) к объекту другого класса;
- но принадлежит к совсем другому классу (и интуитивно и по методу KNN, которым получена картинка);
Вложения
s2.png
s2.png (22.43 КБ) 3663 просмотра

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Модели классификаторов

Непрочитанное сообщение Olej » 09 янв 2019, 12:05

Olej писал(а):- но принадлежит к совсем другому классу (и интуитивно и по методу KNN, которым получена картинка);
Метод KNN - 1-й из рассматриваемых - метод K ближайших соседей.
Задача классификации в машинном обучении — это задача отнесения объекта к одному из заранее определенных классов на основании его формализованных признаков. Каждый из объектов в этой задаче представляется в виде вектора в N-мерном пространстве, каждое измерение в котором представляет собой описание одного из признаков объекта.
Программа ручной реализации метода KNN, понятной по коду как он работает: объект принадлежит к тому классу, к которому принадлежат большинство из окружения K (3, 5, 7, ...) его соседей:

Код: Выделить всё

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 
import sys
import random
import math
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

def inPoint( prompt ):
    while( True ):
        sys.stdout.write( prompt )
        sys.stdout.flush()
        s = sys.stdin.readline()
        if s == '\n' or s == '':                  # Enter or ^D - завершение ввода			
            sys.stdout.write( '\r' )
            return None 
        try:
            ( x, y ) = s.split()
            p = ( float( x ), float( y ) ) 
        except Exception as err:
            print( 'format error: ' + str( err ) )
            continue
        return p

def generateData( Classes, numberOfEl = 10 ):     # Genegate train data
    data = []
    for num in range( len( Classes ) ):
        for row in range( numberOfEl ):           # Choose numberOfEl random nodes with RMS=1
            data.append( [ [ random.gauss( Classes[ num ][ 0 ], 1.0 ), 
                             random.gauss( Classes[ num ][ 1 ], 1.0 ) ], num ] )
    return data

print( 'training center coordinates (format: X Y ; Enter or ^D - finish)' )
centers = []
while True:
    z = inPoint( 'point number {} : '.format( len( centers ) + 1 ) )
    if( z == None ): break;
    centers.append( z )
print( centers )

if len( sys.argv ) > 1:
    train = generateData( centers, int( sys.argv[ 1 ] ) ) 
else:
    train = generateData( centers ) 
print( '{} => {}'.format( len( centers ), len( train ) ) )

colors = []
groups = []
for c in range( len( centers ) ):
    colors.append( matplotlib.colors.to_hex( ( random.random(), random.random(), random.random() ) ) ) 
    groups.append( 'class #{:02d}'.format( c ) ) 
clist = matplotlib.colors.ListedColormap( colors )
print( groups )

def classifyKNN( trainData, testData, k ):        # KNN classification procedure
    def dist( a, b ): #Euclidean distance between 2-dimensional point
        return math.sqrt( ( a[ 0 ] - b[ 0 ] ) ** 2 + ( a[ 1 ] - b[ 1 ] ) ** 2 )
    testLabels = []	
    for testPoint in testData:
        #Claculate distances between test point and all of the train points
        testDist = [ [ dist( testPoint[ 0 ], trainData[ i ][ 0 ] ), trainData[ i ][ 1 ] ]
                     for i in range( len( trainData ) ) ]
        #How many points of each class among nearest K
        stat = [ 0 for i in range( len( trainData ) ) ]
        for d in sorted( testDist )[ 0:k ]:
            stat[ d[ 1 ] ] += 1
        #Assign a class with the most number of occurences among K nearest neighbours
        testLabels.append( sorted( zip( stat, range( len( trainData ) ) ), reverse = True )[ 0 ][ 1 ] )
    return testLabels

k = 5                                             # numner nearest neighbours
if len( sys.argv ) > 2:
    k = int( sys.argv[ 2 ] ) 

while True:
    test = []
    print( 'testing points (format: X Y ; Enter or ^D - finish)' )
    while True:
        z = inPoint( 'point number {} : '.format( len( test ) + 1 ) )
        if( z == None ): break;
        test.append( [ [ z[ 0 ], z[ 1 ] ], 0 ] ) 
    if 0 == len( test ): break 

    for i in range( len( centers ) ):
        plt.scatter( centers[ i ][ 0 ], centers[ i ][ 1 ],
                     label = groups[ i ], marker = '^',
                     c = colors[ i ] )             # center / legend points

    plt.scatter( [ train[ i ][ 0 ][ 0 ] for i in range( len( train ) ) ],
                 [ train[ i ][ 0 ][ 1 ] for i in range( len( train ) ) ],
                 c = [ train[ i ][ 1 ] for i in range( len( train ) ) ],
                 cmap = clist )                    # train points
 
    labels = classifyKNN( train, test, k )
    print( labels )

    for i in range( len( test ) ):
        plt.scatter( test[ i ][ 0 ][ 0 ], test[ i ][ 0 ][ 1 ],
                     s = 200, marker = '+', alpha = 0.5,
                     c = colors[ labels[ i ] ] )   # test points

    plt.legend( groups )
#    pl.legend( loc = 2 )
    plt.gcf().canvas.set_window_title( 'manual implementation KNN' )    
    plt.show() 

Код: Выделить всё

<pre>olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrn.py 40 7
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 3
point number 3 : 3 0
point number 4 : 0 0
point number 5 : 
[(0.0, 3.0), (3.0, 3.0), (3.0, 0.0), (0.0, 0.0)]
4 => 160
[&apos;class #00&apos;, &apos;class #01&apos;, &apos;class #02&apos;, &apos;class #03&apos;]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 1 1
point number 2 : 1 2
point number 3 : 2 2
point number 4 : 2 1
point number 5 : 
[3, 0, 1, 3]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 
</pre>
Вложения
r7.png
modrn.py
(3.94 КБ) 139 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Модели классификаторов

Непрочитанное сообщение Olej » 09 янв 2019, 12:15

Olej писал(а): Метод KNN - 1-й из рассматриваемых - метод K ближайших соседей.
Тот же метод, но реализуемый алгоритмами машинного обучения из пакета Sklearn:

Код: Выделить всё

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 
import sys
import random
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from sklearn import neighbors

def inPoint( prompt ):
    while( True ):
        sys.stdout.write( prompt )
        sys.stdout.flush()
        s = sys.stdin.readline()
        if s == '\n' or s == '':                  # Enter or ^D - завершение ввода			
            sys.stdout.write( '\r' )
            return None 
        try:
            ( x, y ) = s.split()
            p = ( float( x ), float( y ) ) 
        except Exception as err:
            print( 'format error: ' + str( err ) )
            continue
        return p

def generateData( Classes, numberOfEl = 10 ):     # Genegate train data
    data = []
    for num in range( len( Classes ) ):
        for row in range( numberOfEl ):           # Choose numberOfEl random nodes with RMS=1
            data.append( [ [ random.gauss( Classes[ num ][ 0 ], 1.0 ), 
                             random.gauss( Classes[ num ][ 1 ], 1.0 ) ], num ] )
    return data

print( 'training center coordinates (format: X Y ; Enter or ^D - finish)' )
centers = []
while True:
    z = inPoint( 'point number {} : '.format( len( centers ) + 1 ) )
    if( z == None ): break;
    centers.append( z )
print( centers )

if len( sys.argv ) > 1:
    train = generateData( centers, int( sys.argv[ 1 ] ) ) 
else:
    train = generateData( centers ) 
print( '{} => {}'.format( len( centers ), len( train ) ) )

colors = []
groups = []
for c in range( len( centers ) ):
    colors.append( matplotlib.colors.to_hex( ( random.random(), random.random(), random.random() ) ) ) 
    groups.append( 'class #{:02d}'.format( c ) ) 
clist = matplotlib.colors.ListedColormap( colors )
print( groups )

k = 5                                             # numner nearest neighbours
if len( sys.argv ) > 2:
    k = int( sys.argv[ 2 ] ) 

#print( len( train ), train )
X = []
y = []
for t in train:
    X.append( t[ 0 ] )
    y.append( t[ 1 ] )
# Create and train the KNN classifier
model = neighbors.KNeighborsClassifier( n_neighbors = k, weights = 'distance' )
model.fit( X, y )
print( model )

while True:
    test = []
    print( 'testing points (format: X Y ; Enter or ^D - finish)' )
    while True:
        z = inPoint( 'point number {} : '.format( len( test ) + 1 ) )
        if( z == None ): break;
        test.append( [ z[ 0 ], z[ 1 ] ] ) 
    if 0 == len( test ): break 

    for i in range( len( centers ) ):
        plt.scatter( centers[ i ][ 0 ], centers[ i ][ 1 ],
                     label = groups[ i ], marker = '^',
                     c = colors[ i ] )             # center / legend points

    plt.scatter( [ train[ i ][ 0 ][ 0 ] for i in range( len( train ) ) ],
                 [ train[ i ][ 0 ][ 1 ] for i in range( len( train ) ) ],
                 c = [ train[ i ][ 1 ] for i in range( len( train ) ) ],
                 cmap = clist )                    # train points
 
    labels = model.predict( test )
    print( labels )

    for i in range( len( test ) ):
        plt.scatter( test[ i ][ 0 ], test[ i ][ 1 ],
                     s = 200, marker = '+', alpha = 0.5,
                     c = colors[ labels[ i ] ] )   # test points 

    plt.legend( groups )
#    pl.legend( loc = 2 )
    plt.gcf().canvas.set_window_title( 'KNeighborsClassifier' )     
    plt.show() 

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrs.py 20 7
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 0
point number 2 : 3 0
point number 3 : 3 3
point number 4 : 0 3
point number 5 : 
[(0.0, 0.0), (3.0, 0.0), (3.0, 3.0), (0.0, 3.0)]
4 => 80
['class #00', 'class #01', 'class #02', 'class #03']
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=7, p=2,
           weights='distance')
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 1 1
point number 2 : 1 2
point number 3 : 2 2
point number 4 : 2 1
point number 5 : 
[1 3 3 3]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 
Вложения
s3.png
modrs.py
(3.3 КБ) 137 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Модели классификаторов

Непрочитанное сообщение Olej » 09 янв 2019, 16:55

Olej писал(а): Тот же метод, но реализуемый алгоритмами машинного обучения из пакета Sklearn:
А теперь такое же приложение, но позволяющее использовать (пока всё в черновом виде) 5 различных классификаторов из Sklearn на выбор:

Код: Выделить всё

#!/usr/bin/python3 
# -*- coding: utf-8 -*- 
import argparse
import random
import matplotlib
import matplotlib.pyplot as plt

from sklearn import metrics
from sklearn import neighbors
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC

from common import inPoint, generateData  

parser = argparse.ArgumentParser()                # Construct the argument parse and parse the arguments
parser.add_argument( '-p', '--points', required = False, type=int, help = 'numbes points into class' )
parser.add_argument( '-m', '--model', required = False, type=int, help = 'model number' )
parser.add_argument( '-d', '--data', required = False, type=int, help = 'add model parameter' )
args = vars( parser.parse_args() )
#print( args )

data = 5                                             # numner nearest neighbours
if args[ 'data' ] != None:
    data = int( args[ 'data' ] )

models_title = ( 'KNeighborsClassifier'   , 'LogisticRegression', 
                 'GaussianNB'             , 'DecisionTreeClassifier',
                 'Support Vector Machines'
               )
#print( len( models_title ) )
modl_num = 0
modl_num = int( args[ 'model' ] )
if( modl_num >= len( models_title ) or modl_num < 0 ):
    modl_num = 0
model_title = models_title[ modl_num ]  
if 0 == modl_num:                                 # K Nearest Neighbors
    model = neighbors.KNeighborsClassifier( n_neighbors = data, weights = 'distance' )
elif 1 == modl_num:                               # Logistic Regression, one-vs-all 
    model = LogisticRegression()
elif 2 == modl_num:                               # Naive Bayes
    model = GaussianNB() 
elif 3 == modl_num:                               # Classification and Regression Trees (CART)
    model = DecisionTreeClassifier()    
elif 4 == modl_num:                               # Support Vector Machines
    model = SVC()

print( model )

print( 'training center coordinates (format: X Y ; Enter or ^D - finish)' )
centers = []
while True:
    z = inPoint( 'point number {} : '.format( len( centers ) + 1 ) )
    if( z == None ): break;
    centers.append( z )
print( centers )

if args[ 'points' ] != None: #    debug = int( args[ 'verbose' ] )
    train = generateData( centers, int( args[ 'points' ] ) ) 
else:
    train = generateData( centers ) 
print( '{} classes => {} points in each'.format( len( centers ), len( train ) ) )

colors = []
groups = []
for c in range( len( centers ) ):
    colors.append( matplotlib.colors.to_hex( ( random.random(), random.random(), random.random() ) ) ) 
    groups.append( 'class #{:02d}'.format( c ) ) 
clist = matplotlib.colors.ListedColormap( colors )
print( groups )

#print( len( train ), train )
X = []
y = []
for t in train:
    X.append( t[ 0 ] )
    y.append( t[ 1 ] )

model.fit( X, y )                                 # train a classifier

while True:                                       # test data  
    test = []
    print( 'testing points (format: X Y ; Enter or ^D - finish)' )
    while True:
        z = inPoint( 'point number {} : '.format( len( test ) + 1 ) )
        if( z == None ): break;
        test.append( [ z[ 0 ], z[ 1 ] ] ) 
    if 0 == len( test ): break 

    for i in range( len( centers ) ):
        plt.scatter( centers[ i ][ 0 ], centers[ i ][ 1 ],
                     label = groups[ i ], marker = '^',
                     c = colors[ i ] )             # center / legend points

    plt.scatter( [ train[ i ][ 0 ][ 0 ] for i in range( len( train ) ) ],
                 [ train[ i ][ 0 ][ 1 ] for i in range( len( train ) ) ],
                 c = [ train[ i ][ 1 ] for i in range( len( train ) ) ],
                 cmap = clist )                    # train points
 
    labels = model.predict( test )
    print( labels )

    for i in range( len( test ) ):
        plt.scatter( test[ i ][ 0 ], test[ i ][ 1 ],
                     s = 200, marker = '+', alpha = 0.5,
                     c = colors[ labels[ i ] ] )   # test points 

    plt.legend( groups )
#    pl.legend( loc = 2 )
    plt.gcf().canvas.set_window_title( model_title )     
    plt.show() 
Вложения
common.py
(929 байт) 133 скачивания
modrsm.py
(4.1 КБ) 144 скачивания

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Модели классификаторов

Непрочитанное сообщение Olej » 09 янв 2019, 17:02

Olej писал(а): А теперь такое же приложение, но позволяющее использовать (пока всё в черновом виде) 5 различных классификаторов из Sklearn на выбор:

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py --help
usage: modrsm.py [-h] [-p POINTS] [-m MODEL] [-d DATA]

optional arguments:
  -h, --help            show this help message and exit
  -p POINTS, --points POINTS
                        numbes points into class
  -m MODEL, --model MODEL
                        model number
  -d DATA, --data DATA  add model parameter
(На картинках центры классов отмечены знаком треугольника, эталонные образцы класса - кружками, а распознаваемый образец - крестом)

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py -m 1
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
          intercept_scaling=1, max_iter=100, multi_class='warn',
          n_jobs=None, penalty='l2', random_state=None, solver='warn',
          tol=0.0001, verbose=0, warm_start=False)
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 0
point number 3 : 
[(0.0, 3.0), (3.0, 0.0)]
2 classes => 10.0 points in each
['class #00', 'class #01']
/usr/local/lib/python3.7/dist-packages/sklearn/linear_model/logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
  FutureWarning)
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 2 2
point number 2 : 
[1]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 
Вложения
l3.png

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Модели классификаторов

Непрочитанное сообщение Olej » 09 янв 2019, 17:07

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py -m 2
GaussianNB(priors=None, var_smoothing=1e-09)
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 0
point number 3 : 
[(0.0, 3.0), (3.0, 0.0)]
2 classes => 20 points in each
['class #00', 'class #01']
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 2 2
point number 2 : 
[0]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 
Вложения
g2.png

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Модели классификаторов

Непрочитанное сообщение Olej » 09 янв 2019, 17:13

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py -m 3 
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
            max_features=None, max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, presort=False, random_state=None,
            splitter='best')
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 0
point number 3 : 
[(0.0, 3.0), (3.0, 0.0)]
2 classes => 20 points in each
['class #00', 'class #01']
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 2 2
point number 2 : 
[0]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 
Вложения
d1.png

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Модели классификаторов

Непрочитанное сообщение Olej » 09 янв 2019, 17:15

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py -m 4
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
  kernel='rbf', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 0
point number 3 : 
[(0.0, 3.0), (3.0, 0.0)]
2 classes => 20 points in each
['class #00', 'class #01']
/usr/local/lib/python3.7/dist-packages/sklearn/svm/base.py:196: FutureWarning: The default value of gamma will change from 'auto' to 'scale' in version 0.22 to account better for unscaled features. Set gamma explicitly to 'auto' or 'scale' to avoid this warning.
  "avoid this warning.", FutureWarning)
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 2 2
point number 2 : 
[0]
testing points (format: X Y ; Enter or ^D - finish)
Вложения
v2.png

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Модели классификаторов

Непрочитанное сообщение Olej » 09 янв 2019, 17:22

Код: Выделить всё

olej@ACER:~/2019_WORK/own.WORK/MachineLearning$ ./modrsm.py -m 0 -p 25 -d 9
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=None, n_neighbors=9, p=2,
           weights='distance')
training center coordinates (format: X Y ; Enter or ^D - finish)
point number 1 : 0 3
point number 2 : 3 0
point number 3 : 
[(0.0, 3.0), (3.0, 0.0)]
2 classes => 25.0 points in each
['class #00', 'class #01']
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 2 2
point number 2 : 
[1]
testing points (format: X Y ; Enter or ^D - finish)
point number 1 : 
(Здесь вот на картинке хорошо видно, что эксперимент ближе к эталону класса 0, но классифицирован он правильно, как класс 1)
Вложения
k2.png

Аватара пользователя
Olej
Писатель
Сообщения: 21336
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Модели классификаторов

Непрочитанное сообщение Olej » 13 фев 2019, 12:28

Это всё модельные данные, искусственно генерируемые.
Но для распознавания и классификации ценнее и интереснее реальные данные из различных областей знаний. Но их собрать совсем не так просто, трудоёмко. Но исследователи из области обработки данных многими годами собирали такие наборы данных, для тестирования и отработки алгоритмов распознавания.
Вот один из таких публичных наборов баз данных: Index of /ml/machine-learning-databases - здесь несколько сот баз данных, от нескольких сот до тысяч реализаций в каждом наборе данных.
Здесь собираются наборы данных начиная с середины 90-х годов.

Дальше реализую модели классификации на этих (некоторых) наборах данных...

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей