机器学习——K-近邻算法(KNN(k-nearest neighbor算法))

定义:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

核心思想:根据“邻居”来推测出你的类别。

关于K的取值:

过小:容易受到异常点的影响

过大:会受到样本不均衡的影响

特点:

优点:简单,易于理解,无需训练

缺点:对测试样本分类时计算量大,内存开销大

            必须指定K值,K值选择会影响分类精度

使用场景:小数据场景

一些函数用法

train_test_split

语法

X_train,X_test, y_train, y_test =cross_validation.train_test_split(X,y,test_size, random_state)

参数说明:X:待划分的样本特征集合

                    y:待划分的样本目标

test_size: 若在0~1之间,为测试集样本数目与原始样本数目之比;若为整数,则是测试集样本的数目。

random_state:随机数种子

返回值:X_train:划分出的训练数据 X_test:划分出的测试集数据

                y_train:划分出的训练集目标 y_test:划分出的测试集目标

fit_transform

fit():求得训练集X的均值,方差,最大值,最小值,这些训练集X固有的属性。

transform():在fit的基础上,进行标准化,降维,归一化等操作

fit_transform() : 二者的结合

StandardScaler()

数据归一化(针对的是每一个特征)

KNeighborsClassifier()

sklearn中KNN算法实现调用函数

参考KNN算法说明以及sklearn 中 neighbors.KNeighborsClassifier参数说明_一年又半的博客-CSDN博客_kneighborsclassifier 参数

主要方法:

fit(X,y):X作为训练数据,y作为训练的目标值,来得到拟合模型

predict(X):通过测试集X来得到测试预测目标

score(X, y[, sample_weight]):返回给定测试数据和标签的平均准确值。

KNN算法的具体实现(数据集为iris数据集)附数据可视化:

from sklearn import neighbors
import  random
import math
import operator
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
def loadData(data,split,target=[],traindata=[],testdata=[],traintarget=[],testtarget=[]):
    for x in range(len(data)-1):
        #target[x] = float(target[x])
        for y in range(4):
            data[x][y]=float(data[x][y])

        if random.random()predicted = " + repr(result) + ",actual = " + repr(testtarget[x]))
    Accuracy = accuracy(testtarget, predata)
    print("Accuracy:" + repr(Accuracy) + "%")
    pca = PCA(n_components=2)
    xr = pca.fit_transform(testdata)
    red_x,red_y=[],[]
    blue_x,blue_y=[],[]
    green_x, green_y = [], []
    red1_x, red1_y = [], []
    blue1_x, blue1_y = [], []
    green1_x, green1_y = [], []
    for i in range (len(xr)):
        if predata[i] == 0:
            red_x.append(xr[i][0])
            red_y.append(xr[i][1])
        elif predata[i] == 1:
            blue_x.append(xr[i][0])
            blue_y.append(xr[i][1])
        elif predata[i] == 2:
            green_x.append(xr[i][0])
            green_y.append(xr[i][1])
        if testtarget[i] == 0:
            red1_x.append(xr[i][0])
            red1_y.append(xr[i][1])
        elif testtarget[i] == 1:
            blue1_x.append(xr[i][0])
            blue1_y.append(xr[i][1])
        elif testtarget[i] == 2:
            green1_x.append(xr[i][0])
            green1_y.append(xr[i][1])
    plt.scatter(red_x,red_y,c='r')
    plt.scatter(blue_x, blue_y, c='b')
    plt.scatter(green_x, green_y, c='g')
    plt.scatter(red1_x, red1_y, c='r',marker='^')
    plt.scatter(blue1_x, blue1_y, c='b',marker='^')
    plt.scatter(green1_x, green1_y, c='g',marker='^')
    plt.show()
if __name__=="__main__":
    main()
*调用sklearn中的KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
def KNN_iris():
    iris_data=load_iris()

    x_train,x_test,y_train,y_test=train_test_split(iris_data.data,iris_data.target,random_state=6) #划分数据集

    transfer=StandardScaler() #数据归一化处理
    x_train=transfer.fit_transform(x_train)
    x_test=transfer.transform(x_test) #测试集目标值归一化处理要与测试集训练值归一化参数一样

    estimator=KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train,y_train)

    y_predict=estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    print("比对真实值和预测值:\n",y_test==y_predict)

    score=estimator.score(x_test,y_test)
    print("准确率:\n",score)
    return None

if __name__=="__main__":
    KNN_iris()

你可能感兴趣的:(算法,近邻算法)