利用KNN对150个实例对花卉进行机器培训

邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。

所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。

该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。kNN方法在类别决策时,只与极少量的相邻样本有关。

由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

算法详述

步骤:

  • 为了判断未知实例的类别,以所有已知类别的实例作为参照
  • 选择参数K
  • 计算未知实例与所有已知实例的距离
  • 选择最近K个已知实例
  • 根据少数服从多数的投票法则(majority-voting),让未知实例归类为K个最邻近样本中最多数的类别

这里写图片描述

这里写图片描述
其他距离衡量:余弦值(cos), 相关度 (correlation), 曼哈顿距离 (Manhattan distance)

数据集介绍

虹膜

这里写图片描述
150个实例

萼片长度,萼片宽度,花瓣长度,花瓣宽度(sepal length, sepal width, petal length and petal width)
类别:Iris setosa, Iris versicolor, Iris virginica.

这里写图片描述

利用Python的机器学习库sklearn: SkLearnExample.py
from sklearn import neighbors
from sklearn import datasets

knn = neighbors.KNeighborsClassifier()


iris = datasets.load_iris()


print(iris)

knn.fit(iris.data, iris.target)

predictedLabel = knn.predict([[0.1, 0.2, 0.3, 0.4]])

print (predictedLabel)
KNN 实现Implementation:
import csv
import random
import math
import operator


def loadDataset(filename, split, trainingSet=[], testSet=[]):
  with open(filename, 'rt') as csvfile:
  lines = csv.reader(csvfile)
  dataset = list(lines)
  for x in range(len(dataset) - 1):
  for y in range(4):
  dataset[x][y] = float(dataset[x][y])
  if random.random() < split:
  # 加入训练集
  trainingSet.append(dataset[x])
  else:
  # 加入测试集
  testSet.append(dataset[x])

def euclideanDistance(instance1, instance2, length):
  distance = 0
  for x in range(length):
  distance += pow((instance1[x] - instance2[x]), 2)
  return math.sqrt(distance)


def getNeighbors(trainingSet, testInstance, k):
  distances = []

  length = len(testInstance) - 1
  for x in range(len(trainingSet)):
  dist = euclideanDistance(testInstance, trainingSet[x], length)
  distances.append((trainingSet[x], dist))
  distances.sort(key=operator.itemgetter(1))
  neighbors = []

  for x in range(k):
  neighbors.append(distances[x][0])
  return neighbors

def getResponse(neighbors):
  classVotes = {}
  for x in range(len(neighbors)):
  response = neighbors[x][-1]
  if response in classVotes:
  classVotes[response] += 1
  else:
  classVotes[response] = 1
  sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)
  return sortedVotes[0][0] 

def getAccuracy(testSet, predictions):
  correct = 0
  for x in range(len(testSet)):
  if testSet[x][-1] == predictions[x]:
  correct += 1
  return (correct / float(len(testSet))) * 100.0


def main():

  trainingSet = []
  testSet = []
  split = 0.67
  loadDataset(r'data.txt', split, trainingSet, testSet)
  print('Train set: ' + repr(len(trainingSet)))
  print('Test set: ' + repr(len(testSet)))
  # generate predictions
  predictions = []
  k = 3
  for x in range(len(testSet)):
  neighbors = getNeighbors(trainingSet, testSet[x], k)
  result = getResponse(neighbors)
  predictions.append(result)
  print('> predicted=' + repr(result) + ', actual=' + repr(testSet[x][-1]))
  accuracy = getAccuracy(testSet, predictions)
  print('Accuracy: ' + repr(accuracy) + '%')


main()

微信公众号首发,关注公众号,第一时间了解最新机器学习笔记,可进相关群,一起讨论,互相进步

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值