二、实验内容:
实现K最近邻居算法
三、实验详细步骤
1、算法描述
输入:训练集(iris数据集)、测试样本()
输出:测试样本的类别
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
2、算法测试
输入多条测试集测试分类算法的精度
精度=被正确分类的样本/总样本数
提示:可以使用交叉验证方法将iris数据集划分为训练集和测试集合
3、欧氏距离(Euclidean Distance)
欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式。
(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧氏距离:
2.三维空间两点a(x1,y1,z1)与b(x2,y2,z2)间的欧氏距离:
(3)两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的欧氏距离:
# 计算两点之间的距离
def eucliDist(A,B):
return np.sqrt(sum(np.power((A - B), 2)))
# return math.sqrt(sum([(a - b)**2 for (a,b) in zip(A,B)]))
X = np.array([1,2,3,4])
Y = np.array([0,1,2,3])
print(eucliDist(X,Y))
knn简单实现:
最终代码:
import numpy as np
import pandas as pd
data = pd.read_csv('iris.csv',header=None).values
x = [5.2,3.2,1.0,0.3]
dist=[]
a=0
b=0
c=0
def eucliDist(A,B):
return np.sqrt(sum(np.power((A - B), 2)))
for i in range(150):
d=eucliDist(x,data[i,0:4])
dist.append(round(d,2))
print(dist)
index =np.argsort(dist)
print(index)
indexk =index[0:3]
print(indexk)
for i in indexk:
x=int(data[i,4])
if x==0:
a=a+1
if x==1:
b=b+1
if x==2:
c=c+1
y=max(a,b,c)
if y==a:
print(0.0)
if y==b:
print(1.0)
if y==c:
print(2.0)
1、算法描述
输入:训练集(iris数据集)、测试样本(5.2,3.2,1.0,0.3)
输出:测试样本的类别
1.计算测试数据与各个训练数据之间的距离;
def eucliDist(A,B):
return np.sqrt(sum(np.power((A - B), 2)))
2.按照距离的递增关系进行排序;
index =np.argsort(dist)
3.选取距离最小的K个点;
indexk =index[0:3]
4.确定前K个点所在类别的出现频率;
for i in indexk:
x=int(data[i,4])
if x==0:
a=a+1
if x==1:
b=b+1
if x==2:
c=c+1
y=max(a,b,c)
5.返回前K个点中出现频率最高的类别作为测试数据的预测分类。
最终代码:
import numpy as np
import pandas as pd
data = pd.read_csv('iris.csv',header=None).values
x = [5.2,3.2,1.0,0.3]
dist=[]
a=0
b=0
c=0
def eucliDist(A,B):
return np.sqrt(sum(np.power((A - B), 2)))
for i in range(150):
d=eucliDist(x,data[i,0:4])
dist.append(round(d,2))
print(dist)
index =np.argsort(dist)
print(index)
indexk =index[0:3]
print(indexk)
for i in indexk:
x=int(data[i,4])
if x==0:
a=a+1
if x==1:
b=b+1
if x==2:
c=c+1
y=max(a,b,c)
if y==a:
print(0.0)
if y==b:
print(1.0)
if y==c:
print(2.0)
2、算法测试
输入多条测试集测试分类算法的精度
精度=被正确分类的样本/总样本数
提示:可以使用交叉验证方法将iris数据集划分为训练集和测试集合
# 计算精度
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
return ("{:2f}%".format(100 * correct / len(testSet)))
def main():
trainingSet = [] # 训练集
testSet = [] # 测试集
split = 0.75 # 分割的比例
loadDataset("iristest.csv", split, trainingSet, testSet)
print("训练集:" + repr(len(trainingSet)))
print("测试集:" + repr(len(testSet))) # 其中repr() 函数将对象转化为供解释器读取的形式。
predictions = [] # 预测值
k = 5
# k = 5 #定义返回5个最近邻居数
for x in range(len(testSet)):
neighbors = getNeighbors(trainingSet, testSet[
x], k)
result = getResponse(neighbors)
predictions.append(result)
print("预测值为: " + repr(result) + ",实际值为: " + repr(testSet[x][-1]))
accuracy = getAccuracy(testSet, predictions)
print("精度为:" + repr(accuracy) + "%")