日常复习KNN近邻算法(第一部分)

from numpy import*#科学计数包
import operator# 运算符模块

#简单的测试
def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group,labels
#group,labels = createDataSet()


#分类器1
def classify0(inX,dataset,labels,k):
    #inX:用于分类的输入变量,dataSet:训练的样本集,标签向量:labels,k:选择最近邻居的数目
    dataset_size = dataset.shape[0]#获取数据集的行数
    m,n = dataset.shape#获取数据集的行和列数
    diffmat = tile(inX,(dataset_size,1)) - dataset #输入变量与数据集分别相减,此时为m*n数组
    sqdiffmat = diffmat**2
    sqdistances = sqdiffmat.sum(axis = 1)#按列相加,此时为m*1数组
    distance = sqdistances**0.5
    sorteddistindicies = distance.argsort()#argsort()函数逆序排序,按元素大小从小到大排序并返回index(索引)
    classcount = {}#创建一个空字典
    for i in range(k):
        voteilabel = labels[sorteddistindicies[i]]#求出第i个标签
        classcount[voteilabel] = classcount.get(voteilabel,0) + 1#访问到字典中的voteilabel标签时,其对应的数值加1
    #将获取的k个近邻的标签按照发生的频率从高到低排序
    sortedclasscount = sorted(classcount.items(),key = operator.itemgetter(1),reverse = True)
    #items() 方法把字典中每对 key 和 value 组成一个元组,并把这些元组放在列表中返回
    #operator.itemgetter(1):按照第二维的数据来排序,reverse:True从大到小,False从小到大
    return sortedclasscount[0][0]

#k近邻算法改进约会网站的配对效果
#将文本记录转化为NumPy的解析程序
def file2matrix(filename):
    fr = open(filename)
    arrayolines = fr.readlines()#将文本的每一行(包含行前的空格,行末加一个\n)作为一个元素,存储在list中
    numberoflines = len(arrayolines)#获取arrayolines这一列表的行数
    returnmat = zeros((numberoflines,3))#生成一个numberoflines*3的numpy矩阵,这里的可以根据具体数据具体调整
    classlabelvector = []
    index = 0
    for line in arrayolines:
        line = line.strip()#截掉所有的回车字符
        listfromline = line.split('\t')#将上一步得到的line中的整行数据分割成一个元素列表
        returnmat[index,:] = listfromline[0:3]#选取前3个元素,将其存储在特征矩阵当中
        classlabelvector.append(int(listfromline[-1]))
        index +=1
#     print(datingdatamat) #ndarray
#     print(datinglabels) #list
    return returnmat,classlabelvector

#代码测试
# datingdatamat,datinglabels = file2matrix('datingTestSet2.txt') 

#归一化特征值
def autonorm(dataset):
    minvals = dataset.min(0)#1*3矩阵
    maxvals = dataset.max(0)#1*3矩阵
    ranges = maxvals - minvals#1*3矩阵
    normdataset = zeros(shape(dataset))
    m = dataset.shape[0]#数据集的行数
    normdataset = dataset - tile(minvals,(m,1))
    normdataset = normdataset/tile(ranges,(m,1))
    return normdataset,range,minvals

#调用sklearn中的MinMaxScaler,同样可以将数据归一化
# from sklearn.preprocessing import MinMaxScaler
# data = datingdatamat
# scaler = MinMaxScaler() #实例化
# scaler = scaler.fit(data) #fit,在这里本质是生成min(x)和max(x)
# result = scaler.transform(data) #通过接口导出结果
# result

#分类器针对约会网站的测试代码
def datingclasstset():
    horatio = 0.2#划分测试集和训练集,范围(0,1)
    datingdatamat,datinglabels = file2matrix('datingTestSet2.txt') 
    normmat,range,minvals = autonorm(datingdatamat)
    m = normmat.shape[0]
    numtestvecs = int(m*horatio)
    errorcount = 0.0
    n = 0
    for i in range(numtestvecs):
        n +=1
        classifierresult = classify0(normmat[i,:],normmat[numtestvecs:m,:],datinglabels[numtestvecs:m],3)
        print("the classifier came back with: %d,the real answer is: %d"%(classifierresult,datinglabels[i]))
        if(classifierresult != datinglabels[i]):errorcount +=1.0
    print("the total error rate is :%f"%(errorcount/float(numtestvecs)))
    print("一共迭代%d次"%n)
        


    
    

    
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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值作为输入,然后得到测试样本的预测类别。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值