机器学习knn算法

 

监督学习分类之KNN算法

大家好,我是小k,又是愉快的学习时光QAQ,今天来看看新学的KNN算法


前言

KNN是比较简单的分类算法之一,经过查阅发现它与K-means算法有挺大差距的,KNN属于监督学习,而K-means属于非监督算法


提示:以下是本篇文章正文内容,下面案例可供参考

一、KNN是什么?

1:KNN,通俗点讲就是将待预测的样本置入数据集中,然后通过用与它最近的k个样本来代表待预测的样本

2:有这样一种论点,一个人的收入,可以通过用与其他经常交往五个人的平均数来确定,称作物以类聚,人以群分,KNN算法核心思想就是类似于此

二、使用步骤

1.引入库

代码如下(示例):

#引入依赖
import numpy as np
import pandas as pd
from sklearn.datasets import  load_iris
from sklearn.model_selection import train_test_split
#切分数据集为训练集和测试集合
from sklearn.metrics import accuracy_score
#用来计算分类预测的准确率

2.核心代码

iris = load_iris()
df = pd.DataFrame(data = iris.data,columns = iris.feature_names)
df['class'] = iris.target
#df['class'] = df['class'].map({0:iris.target_names[0],1:iris.target_names[1],2:iris.target_names[2]})

#data ->x ,target->y
x = iris.data
y = iris.target.reshape(-1,1)

#划分训练集和测试集


x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.3,random_state = 35,stratify = y)


#核心算法实现
#距离函数定义
def l1_distance(a,b): #a是一个矩阵,b是一个向量
    return np.sum(np.abs(a-b),axis = 1)

def l2_distance(a,b):
    return np.sqrt(np.sum(a-b)**2,axis = 1)

#分类器实现
class KNN(object):
    #定义一个初始化方法,__init__是类的构造方法
    def __init__(self,n_neighbors =1,dist_func = l1_distance):
        self.n_neighbors = n_neighbors
        self.dist_func = dist_func

    #训练模型方法
    def fit(self,x,y):
        self.x_train = x
        self.y_train = y
    #模型预测方法
    def predict(self,x):
        y_pred = np.zeros((x.shape[0],1),dtype = self.y_train.dtype)
        for i,x_test in enumerate(x):#拿出元组
            distances = self.dist_func(self.x_train,x_test)
            nn_index = np.argsort(distances)
            nn_y = self.y_train[nn_index[:self.n_neighbors]].ravel()
            y_pred[i] = np.argmax(np.bincount(nn_y))#统计后边每个数值出现的个数

        return y_pred

knn = KNN(n_neighbors=3)
knn.fit(x_train,y_train)
y_pre = knn.predict((x_test))

#求出预测准确率
accuracy = accuracy_score(y_test,y_pre)
print("预测准确率为:{}".format(accuracy))

上面是所有代码集合。

 

代码如下(示例):

机器学习knn算法_第1张图片

 

这一段是KNN核心算法的体现,dinstances是求出测试集第i个点与训练集每个点的距离,nn_index对求出各个距离的索引进行排序(不需要知道具体大小值),最后再由索引值转化为所属类,ravel函数转换为一维列表。


总结

最后预测准确率为0.9333333,还不错,数据集从sklearn库中调取。

(本文大部分内容经查阅大部分文章整理而成,未注明转载请谅解)

你可能感兴趣的:(算法,机器学习,列表,人工智能)