1、库
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
2、欧式距离函数
计算欧氏距离,即两点间的直线距离
参数:vector1-List列表,n维属性坐标值构成的向量
vector2-List列表,n维属性坐标值构成的向量
返回值:浮点数,欧氏距离
欧氏距离计算函数
对应向量相减-平方-求和-开平方
def euclDistance(vector1,vector2):
return np.sqrt(np.sum(np.power(vector2-vector1,2)))
3、数据集、标签函数
def createDataSet():
# 生成一个矩阵,每行表示一个样本
group=np.array([[1.0,0.9],[1.0,1.0],[0.8,0.9],[0.6,0.65],[0.1,0.2],[0.3,0.4],[0.2,0.3],[0.0,0.1]])
# 监督学习,手工设置8个样本所属的类别标签
labels=['A','A','A','A','B','B','B','B']
return group,labels # dataSet,labels=createDataSet()
4、KNN分类算法函数
KNN分类算法函数实现
参数:newInput-List列表,待分类的数据点
dataSet-List列表,已分类点坐标
labels-List列表,分类标签
k-整数,近邻数量
返回值:maxIndex-字符,分类结果
def kNNClassify(newInput,dataSet,labels,k):
numSamples=dataSet.shape[0]
distance=[]
for vec in dataSet:
distance.append(euclDistance(newInput,vec))
sortedDistIndices=np.argsort(distance)
classCount={}
for i in range(k):
voteLabel=labels[sortedDistIndices[i]]
classCount[voteLabel]=classCount.get(voteLabel,0)+1
maxCount=0
for key,value in classCount.items():
if value>maxCount:
maxCount=value
maxIndex=key
return maxIndex
5、结果
#生成数据集和类别标签
dataSet,labels=createDataSet()
#K取值3,调用K近邻分类算法
k=3
#对testX进行分类
testX=np.array([1.2,1.0])
outputLabel=kNNClassify(testX,dataSet,labels,3)
print("Your input is:",testX,"and classified to class:",outputLabel)
#对testY进行分类
testY=np.array([0.1,0.3])
outputLabel=kNNClassify(testY,dataSet,labels,3)
print("Your input is:",testY,"and classified to class:",outputLabel)
Your input is: [1.2 1. ] and classified to class: A
Your input is: [0.1 0.3] and classified to class: B