使用KNN对点进行二分类

实现一个KNN对坐标点进行二分类分算法,将四个点分为两类,标签是:“A”,“B”,其中用到了matplotlib对图像进行处理。

import numpy as np
import matplotlib.pyplot as plt #画图,把几个要分类的点画出来
import operator

def createDataSet():#分类数据
    group = np.array([   #knn是监督学习,要有标签
        [1.0,1.1],        #二维数组
        [1.0,1.0],
        [0,0],
        [0,0.1]
    ])
    labels = ['A','A','B','B']#标签A,B类
    return group,labels


def show_data(group,labels):
    labels = np.array(labels)
    index_a = np.where(labels == "A") #输出A的索引  where很重要
    index_b = np.where(labels == "B")  #输出B的索引
    for i in labels:#注意这个for循环,比较重要
        if i == "A":
            plt.scatter(group[index_a][:,:1],group[index_a][:,1:2],c='red')#画点 plt.scatter(x,y,c)可以画张量 plt.plot只能画标量
        elif i == "B":
            plt.scatter(group[index_b][:,:1],group[index_b][:,1:2],c="green")
    plt.show()


def classify(inX,dataset,labels,k):#x是待分类新数据,没有标签
    dataSetSize = dataset.shape[0]#看数据的形状,检验数据正确与否
    diffMat = np.tile(inX,(dataSetSize,1))-dataset #将X按1轴广播,减去原有的数据得到差值
    sqDiffMat = diffMat**2
    sqDistance = sqDiffMat.sum(axis=1)#按1轴求和
    distance = sqDistance ** 0.5#开方

    sortedDistanceIndex = distance.argsort()#排序(排索引)由小到大
    print(sortedDistanceIndex.shape)

    #存放最终的投票结果
    classCount = {}#字典

    for i in range(k):
        voteIlabel = labels[sortedDistanceIndex[i]]#取出邻居

        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
    print(classCount)
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#对字典按值排序,反向排序
    return sortedClassCount[0][0] #取键




if __name__ == '__main__':
    #导入数据
    dataSet,labels = createDataSet()
    #新数据
    inX = [0.5,0.5]
    className = classify(inX,dataSet,labels,3)
    print("该数据属于{}类".format(className))
    dataSet = np.vstack((dataSet,inX))#vstack:纵向堆叠,必须是元组
    labels.append(className)
    show_data(dataSet,labels)

运行结果:将五个点分为了两类
转载或引用请注明来源!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是用 Matlab 语言实现使用 KNN 算法对数据进行二分类的步骤: 1. 准备数据集,包括训练数据和测试数据。假设数据集为 $D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)\}$,其中 $x_i$ 是数据的特征向量,$y_i$ 是数据的标签(二分类问题中,$y_i$ 取值为 0 或 1)。 2. 对数据进行归一化处理,将特征向量的取值范围映射到 [0,1] 区间内。 3. 将数据集按照一定的比例分成训练集和测试集,比如 7:3。 4. 定义 KNN 算法的主体函数,输入为测试数据特征向量 $x$,输出为预测的标签 $\hat{y}$。具体实现过程如下: 4.1 计算测试数据与每个训练数据的距离,可以选择欧氏距离或曼哈顿距离等。 4.2 选择距离最近的 $K$ 个训练数据。 4.3 对这 $K$ 个训练数据的标签进行投票,选择出现次数最多的标签作为预测结果 $\hat{y}$。 5. 对测试集中的每个数据,调用 KNN 算法函数得到预测结果,计算预测准确率。 下面是一个简单的示例代码,实现了 KNN 算法对 iris 数据进行二分类: ```matlab % Load iris dataset load fisheriris % Prepare data X = meas(:,1:2); Y = (strcmp(species,'setosa'))*1; % Normalize data X = (X - min(X)) ./ (max(X) - min(X)); % Split data into training and testing set idx = randperm(50); X_train = [X(idx(1:35),:); X(50+idx(1:35),:)]; Y_train = [Y(idx(1:35)); Y(50+idx(1:35))]; X_test = [X(idx(36:end),:); X(50+idx(36:end),:)]; Y_test = [Y(idx(36:end)); Y(50+idx(36:end))]; % Define KNN algorithm function function [y_pred] = knn(X_train, Y_train, X_test, K) [n_train, ~] = size(X_train); [n_test, ~] = size(X_test); y_pred = zeros(n_test, 1); for i=1:n_test dist = sum((X_train - ones(n_train,1)*X_test(i,:)).^2, 2); [~, idx] = sort(dist); y_k = Y_train(idx(1:K)); y_pred(i) = mode(y_k); end end % Test KNN algorithm with K=3 y_pred = knn(X_train, Y_train, X_test, 3); accuracy = sum(y_pred == Y_test) / length(Y_test); disp(['Accuracy: ', num2str(accuracy)]); ``` 以上代码中,我们使用 iris 数据集的前两个特征作为输入,将 setosa 类别标签设为 1,其余设为 0。然后对数据进行归一化处理,按照 7:3 的比例分成训练集和测试集。最后调用 `knn` 函数实现 KNN 算法,计算预测准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值