KNN近邻算法代码

本文介绍了一个KNN算法的Python实现,并通过几个实例展示了如何使用KNN进行分类任务,包括简单的数据集分类、约会网站匹配系统及手写数字识别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

KNN.py

# from numpy import *
import operator
import numpy as np
def createDataSet():
    group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1],[1.3,0.8],[0.3,0.6]])
    labels = ['A','A','B','B','B','A']
    return group,labels
def calassfy0(intx,dataset ,labels,k):
    datasize = dataset.shape[0]
    diffMat = np.tile(intx ,(datasize,1))-dataset
    # print("diffMat=",diffMat)
    sqDifMat = diffMat**2
    # print("sqDifMat=",sqDifMat)
    sqDistances = sqDifMat.sum(axis=1)
    # print("sqDistance",sqDistances)
    distance = sqDistances**0.5
    # print("distance",distance)
    sortDistanceindex = distance.argsort()
    # print("sortDistance  返回的是坐标",sortDistanceindex)
    classCount ={}
    for i in range(5):
        voteIlabe = labels[sortDistanceindex[i]]
        classCount[voteIlabe] = classCount.get(voteIlabe,0)+1
    # print("classCount.items()=",classCount.items(),type(classCount.items()))
    sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse=True)
    # print(sortedClassCount,type(sortedClassCount))
    return sortedClassCount[0][0]

group,label=createDataSet()
print(calassfy0([0.7, 0.5], group, label, 3))
# print(group.shape,type(group.shape))
"""
    dict.get(key, default=None)
    Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。
    
    
    Python 3.x
        Python 3.x 里面,iteritems() 和 viewitems() 这两个方法都已经废除了,
        而 items() 得到的结果是和 2.x 里面 viewitems() 一致的。
        在3.x 里 用 items()替换iteritems() ,可以用于 for 来循环遍历。
"""

Pary.py


import matplotlib

import matplotlib.pyplot as plt
import numpy as np
import KNN

def file2matrix(filename):
    f = open(filename)
    lines = f.readlines()
    # print('lines = ', lines)
    numberOfLines = len(lines)
    # print('numberOfLines', numberOfLines)
    reMat = np.zeros((numberOfLines, 3))
    # print('reMat=', reMat)
    classLabe = []
    index = 0
    for i in lines:
        # print('i=', i)
        i= i.strip()
        data = i.split('\t')
        # print(data, type(data[0]))
        reMat[index, :] = data[0:3]
        classLabe.append(float(data[3]))
        index += 1
        # print('reMat=', reMat)
    return reMat, classLabe


def drawPic(data, labels):
    # //array ={1:'r',2:'b',3:'g'}
    plt.scatter(data[:, 1], data[:, 2], s=15 * np.array(labels), c=150 * np.array(labels))
    # print(15 * np.array(labels))
    plt.show()


def autonorm(data): #归一化数据
    min = data.min(0)
    max = data.max(0)
    rang = max - min
    # Nomaldata = np.zeros(np.shape(data))
    Nomaldata = data - np.tile(min, (data.shape[0],1))
    Nomaldata = Nomaldata / np.tile(rang, (data.shape[0], 1))
    return Nomaldata,rang,min

def testKNN(onedata,b):
    m= onedata.shape[0]
    err=0
    cnt = int(m*0.1)
    for i in range(cnt):
        result = KNN.calassfy0(onedata[i,:],onedata[cnt:m,:],b[cnt:m],3)#
        print("result=%d lane=%d"%(result,b[i]))
        if result!= b[i]:
            err+=1
    print("err= %.2f %%"%(err/cnt))
# a, b = file2matrix('a.txt')
# print('------------------------------')
# print(a)
# #drawPic(a,b)
# print('--------------')
# print(autonorm(a))
# onedata,rangdata,mindata = autonorm(a)
#
# testKNN(onedata,b);

def image2vector(filename):
    # print(filename)
    revector = np.zeros((1,1024))
    fp=open(filename);
    for i in range(32):
        line =fp.readline()
        for j in range(32):
            revector[0,32*i+j]=int(line[j])
    return revector


# print(image2vector("/0_0.txt")[0,0:32])
import os,sys
def handWritingClassTest():
    hwLabel=[]
    trainingFileList = os.listdir('./trainingDigits')
    mlen = len(trainingFileList)
    trainMat = np.zeros((mlen,1024))
    for i in range(mlen):
        filename = trainingFileList[i]
        file = filename.split('.')[0]
        hwLabel.append(int (file.split('_')[0]))
        trainMat[i,:] = image2vector('./trainingDigits/%s'%(filename))
    testFileList = os.listdir('./testDigits')
    error =0
    cnt = len(testFileList)
    # print(cnt,'----------1111111111')
    for i in range(cnt):
        filename = testFileList[i]
        filestr = filename.split('.')[0]
        label = int(filestr.split('_')[0])
        vecteruderTest = image2vector('./testDigits/%s'%(filename))
        ClassResult = KNN.calassfy0(vecteruderTest,trainMat,hwLabel,3)
        if label!=ClassResult:
            print('std class =%d  test result =%d filename %s'  % (label, ClassResult,filename))
            error+=1
    print("error = %d,错误率是 %f"%(error,error/cnt))


handWritingClassTest()

资源下载:https://download.youkuaiyun.com/download/u010261063/10319972

KNN(K-Nearest Neighbors)近邻算法的MATLAB代码可以按照以下步骤实现: 1. 定义一个距离矩阵,初始化为全零矩阵。 2. 定义训练数据集和测试数据集的长度。 3. 对每个测试样本,计算与训练样本的距离,并存储在距离矩阵中。 4. 使用选择排序的方法,对距离矩阵进行排序,找出最小的前K个距离对应的训练样本。 5. 统计这K个样本中最常出现的类别,作为测试样本的预测类别。 6. 返回测试样本的预测类别。 具体的MATLAB代码如下: ```matlab function predicted_labels = knn(train_data, train_labels, test_data, K) train_length = size(train_data, 1); test_length = size(test_data, 1); distance = zeros(train_length, 1); predicted_labels = zeros(test_length, 1); for i = 1:test_length for j = 1:train_length distance(j) = calculate_distance(test_data(i,:), train_data(j,:)); end % 使用选择排序的方法对距离矩阵进行排序,并得到最小的前K个距离对应的标签 for g = 1:K ma = distance(g); tmp = 1; label_ma = 0; for j = g+1:train_length if distance(j) < ma ma = distance(j); label_ma = train_labels(j); tmp = j; end end distance(tmp) = distance(g); distance(g) = ma; train_labels(tmp) = train_labels(g); train_labels(g) = label_ma; end % 统计最小的前K个样本中最常出现的类别,作为测试样本的预测类别 unique_labels = unique(train_labels(1:K)); counts = histc(train_labels(1:K), unique_labels); [~, max_idx = max(counts); predicted_labels(i) = unique_labels(max_idx); end end function distance = calculate_distance(x1, x2) % 计算两个样本之间的距离(这里可以根据具体问题选择不同的距离度量方法) distance = sqrt(sum((x1 - x2).^2)); end ``` 这是一个基本的KNN近邻算法的MATLAB实现,你可以将训练数据集、训练标签、测试数据集和K值作为输入,然后得到测试样本的预测类别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Car12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值