机器学习 knn算法简单实现

二、实验内容:

实现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)间的欧氏距离:



(4)也可以用表示成向量运算的形式:

 

 

 

# 计算两点之间的距离

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) + "%")

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值