English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Реализация алгоритма классификации KNN на Python

В этой статье пример для вас делится конкретным кодом алгоритма классификации KNN на Python, для вашего рассмотрения, конкретное содержимое следующим образом

Алгоритм классификации KNN можно считать одним из самых простых алгоритмов классификации в машинном обучении, где KNN означает K-NearestNeighbor (K ближайших邻邻样本 узлов). Перед классификацией классификатор KNN читает большое количество образцов данных с метками классов в качестве данных для参照ения классификации, когда он классифицирует образцы с неизвестными категориями, он вычисляет величину различий между текущим образцом и всеми образцами для参照ения; эта величина различий измеряется расстоянием между точками данных в многомерном пространстве характеристик образцов, то есть, если два образца близки друг к другу в их многомерном пространстве характеристик, то различия между ними меньше, и вероятность того, что они принадлежат к одной и той же категории, выше. Алгоритм классификации KNN использует это основное знание, вычисляя расстояние между образцом для предсказания и всеми образцами в пространстве образцов для参照ения, и находим K ближайших образцов для参照ения, и подсчитываем класс, в котором доминирует количество ближайших K образцов, и этот класс принимается в качестве результата предсказания.

Модель KNN очень проста, она не включает обучение модели, каждый раз при прогнозе необходимо вычислить расстояние до всех известных точек, поэтому с увеличением количества образцов расчетная нагрузка классификатора KNN также пропорционально увеличивается, и KNN не подходит для наборов данных с очень малым количеством образцов. После того как была предложена модель KNN, многие люди предложили множество улучшенных алгоритмов, направленных на повышение скорости и точности алгоритма, но все они основаны на принципе «чем ближе расстояние, тем выше вероятность сходства». В данном случае с помощью Python реализован самый原始ный вариант алгоритма KNN, данные набора данных используются из набора данных, часто используемого в курсах машинного обучения, и я добавил небольшое количество шума в исходные данные, чтобы проверить устойчивость алгоритма KNN.

Набор данных использует набор данных ирисаСсылка для скачивания.

Набор данных содержит 90 данных (тренировочный набор), разделенных на 2 класса, по 45 данных в каждом классе, каждый данные имеет 4 свойства 

Sepal.Length (длина чашечки), единица измерения - см;
Sepal.Width (ширина чашечки), единица измерения - см;
Petal.Length (длина лепестка), единица измерения - см;
Petal.Width (ширина лепестка), единица измерения - см;

Классы категорий: Iris Setosa (Горная ирис), Iris Versicolour (Многоцветная ирис)
Раньше я занимался C++, но недавно начал изучать Python, сегодня я хочу реализовать KNN, чтобы потренироваться, вот код:

#coding=utf-8
import math
#определение класса данных ириса
class Iris:
 data=[]
 label=[]
 pass
#определение функции чтения набора данных ириса
def load_dataset(filename="Iris_train.txt"):
 f=open(filename)
 line=f.readline().strip()
 propty=line.split(',')#имена свойств
 dataset=[]#сохранение информации о данных каждого образца
 label=[]#сохранение меток образцов
 while line:
 line=f.readline().strip()
 if(not line):
 break
 temp=line.split(',')
 content=[]
 for i in temp[0:-1]:
 content.append(float(i))
 dataset.append(content)
 label.append(temp[-1])
 total=Iris()
 total.data=dataset
 total.label=label
 return total # вернуть набор данных
# определить класс KnnClassifier
class KnnClassifier:
 def __init__(self, k, type="Euler"): # при инициализации определить положительное целое k и способ вычисления расстояния
 self.k=k
 self.type=type
 self.dataloaded=False
 def load_traindata(self, traindata): # загрузка набора данных
 self.data=traindata.data
 self.label=traindata.label
 self.label_set=set(traindata.label)
 self.dataloaded=True # флаг загрузки набора данных
 def Euler_dist(self, x, y): # метод расчета евклидовой distances, x, y - это вектора
 sum=0
 for i, j in zip(x, y):
 sum+=math.sqrt((i-j)**2)
 return sum
 def Manhattan_dist(self, x, y): # метод расчета манхэттенской distances, x, y - это вектора
 sum=0
 for i, j in zip(x, y):
 sum+=abs(i-j)
 return sum
 def predict(self, temp): # функция предсказания, читает данные прогнозируемого образца, temp - это вектор
 if(not self.dataloaded): # проверять наличие обучающих данных
 print "No train_data load in"
 return
 distance_and_label=[]
 if(self.type=="Euler"): # определять способ вычисления расстояния, евклидова или манхэттенская距离
 for i, j in zip(self.data, self.label):
 dist=self.Euler_dist(temp, i)
 distance_and_label.append([dist, j])
 else:
 if(self.type=="Manhattan"):
 for i, j in zip(self.data, self.label):
 dist=self.Manhattan_dist(temp, i)
 distance_and_label.append([dist, j])
 else:
 print "type choice error"
 #获取K个最邻近的样本的距离和类别标签
 neighborhood=sorted(distance_and_label,cmp=lambda x,y : cmp(x[0],y[0]))[0:self.k]
 neighborhood_class=[]
 for i in neighborhood:
 neighborhood_class.append(i[1])
 class_set=set(neighborhood_class)
 neighborhood_class_count=[]
 print "In k nearest neighborhoods:",
 #统计该K个最邻近点中各个类别的个数
 for i in class_set:
 a=neighborhood_class.count(i)
 neighborhood_class_count.append([i,a])
 print "class: ",i," count: ",a
 result=sorted(neighborhood_class_count,cmp=lambda x,y : cmp(x[1],y[1]))[-1][0]
 print "result: ",result
 return result#返回预测的类别
if __name__ == '__main__':
 traindata=load_dataset()#training data
 testdata=load_dataset("Iris_test.txt")#testing data
 #新建一个Knn分类器的K为20,默认为欧拉距离计算方式
 kc=KnnClassifier(20)
 kc.load_traindata(traindata)
 predict_result=[]
 #预测测试集testdata中所有待预测样本的结果
 for i,j in zip(testdata.data,testdata.label):
 predict_result.append([i,kc.predict(i),j])
 correct_count=0
 #将对预测结果和正确结果进行对比,计算此次预测的准确率
 for i in predict_result:
 if(i[1]==i[2]):
 correct_count+=1
 ratio=float(correct_count)/len(predict_result)
 print "correct predicting ratio",ratio

Результаты классификации 11 тестовых образцов в тестовом наборе:

В k ближайших соседях:
класс: Iris-setosa количество: 20
результат: Iris-setosa
В k ближайших соседях:
класс: Iris-setosa количество: 20
результат: Iris-setosa
В k ближайших соседях:
класс: Iris-setosa количество: 20
результат: Iris-setosa
В k ближайших соседях:
класс: Iris-setosa количество: 20
результат: Iris-setosa
В k ближайших соседях:
класс: Iris-setosa количество: 20
результат: Iris-setosa
В k ближайших соседях:
класс: Iris-versicolor количество: 20
результат: Iris-versicolor
В k ближайших соседях:
класс: Iris-versicolor количество: 20
результат: Iris-versicolor
В k ближайших соседях:
класс: Iris-versicolor количество: 20
результат: Iris-versicolor
В k ближайших соседях:
класс: Iris-versicolor количество: 20
результат: Iris-versicolor
В k ближайших соседях:
класс: Iris-versicolor количество: 20
результат: Iris-versicolor
В k ближайших соседях:
класс: Iris-setosa количество: 18
класс: Iris-versicolor количество: 2
результат: Iris-setosa
правильный коэффициент предсказания 0.909090909091

В KNN есть много способов вычисления расстояний, различные методы подходят для различных наборов данных, в этом коде реализованы только два способа вычисления: евклидова и манхэттенская的距离; данные в тестовом наборе извлечены из исходных данных, объем данных не велик, результаты не могут полностью отражать производительность KNN, поэтому результаты выполнения программы仅供参考。

Вот и все, что касается этой статьи, надеюсь, это поможет вам в изучении, также希望大家多多支持呐喊教程。

Заявление: содержание этой статьи взято из интернета, авторские права принадлежат их законным владельцам, материалы предоставлены пользователями интернета, сайт не обладает правами собственности, материалы не редактировались вручную и не несут ответственности за них. Если вы обнаружите подозрительное нарушение авторских прав, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @) для сообщения и предоставления доказательств. При подтверждении нарушения, сайт незамедлительно удалят спорное контент.

Основной учебник
Тебе может понравиться