欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基础算法-KNN(邻近算法)

程序员文章站 2022-03-29 14:48:33
...

KNN算法原理介绍

KNN概述

基础算法-KNN(邻近算法)
knn的线性回归例子
房东房屋出租:租多少钱合适呢?
找到和自己房子位置、户型等条件类似的n套,它们多少租金,我也多少租金。

基础算法-KNN(邻近算法)
knn的逻辑回归例子:
有已知的4部电影:根据镜头类别多少来分类成动作片和爱情片。有一部未知电影,假设K = 3,那么就计算其与前3部电影的距离d1,d2,d3,当未知电影与爱情片的距离d1、d2小于和动作片的距离d3时,判定未知电影是爱情片。

算法核心和实质

核心:物以类聚,人以群分
实质:找邻居,投票决定
基础算法-KNN(邻近算法)

原理详述

如何找邻居,找几个,如何投票?

基础算法-KNN(邻近算法)

距离的定义

基础算法-KNN(邻近算法)

欧式距离:两点间直线距离
曼哈顿距离:直线作为斜边构成直角三角形,两条直角边就是曼哈顿距离

K值的选取

k值选取不同,会导致不同的结果

如何投票

哪个多就是哪个类别

优缺点

基础算法-KNN(邻近算法)

代码实战

KNN算法API参数详解

基础算法-KNN(邻近算法)

n_neighbors:K值,邻居的个数,默认为5【关键参数】,为了取得合适的k,一般会先遍历

score():调出knn方法效果的评分

经典数据集分类任务(单分类)

"""
鸢尾花
"""
import pandas as pd
'''
训练集
测试集
'''
train_data = pd.read_excel(r'/Users/dx/Desktop/Python数据分析与机器学习/7.KNN算法/鸢尾花案例/鸢尾花训练数据.xlsx')
test_data = pd.read_excel(r'/Users/dx/Desktop/Python数据分析与机器学习/7.KNN算法/鸢尾花案例/鸢尾花测试数据.xlsx')

'''
处理数据
数据分离
'''
train_data.columns
train_x = train_data[['萼片长(cm)', '萼片宽(cm)', '花瓣长(cm)', '花瓣宽(cm)']]
train_y = train_data[['类型_num']]

'''
数据标准化
Z-Score标准化
'''
from sklearn.preprocessing import scale
data = pd.DataFrame()
data['萼片长标准化'] = scale(train_x['萼片长(cm)'])
data['萼片宽标准化'] = scale(train_x['萼片宽(cm)'])
data['花瓣长标准化'] = scale(train_x['花瓣长(cm)'])
data['花瓣宽标准化'] = scale(train_x['花瓣宽(cm)'])

'''
使用sklearn中的knn模块
'''
from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(data,train_y)

knn.score(data, train_y)
train_predicted = knn.predict(data)

'''
绘制混淆矩阵并可视化
'''
from sklearn import metrics
print(metrics.classification_report(train_y, train_predicted))


def cm_plot(y,yp):
    from sklearn.metrics import confusion_matrix 
    import matplotlib.pyplot as plt
    
    cm = confusion_matrix(y, yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',
                         verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

cm_plot(train_y,train_predicted).show()

'''
使用测试集测试
'''
test_data.columns
test_x = train_data[['萼片长(cm)', '萼片宽(cm)', '花瓣长(cm)', '花瓣宽(cm)']]
test_y = train_data[['类型_num']]

#Z标准化
data_test = pd.DataFrame()
data_test['萼片长标准化'] = scale(test_x['萼片长(cm)'])
data_test['萼片宽标准化'] = scale(test_x['萼片宽(cm)'])
data_test['花瓣长标准化'] = scale(test_x['花瓣长(cm)'])
data_test['花瓣宽标准化'] = scale(test_x['花瓣宽(cm)'])

#使用测试集预测结果
test_predicted = knn.predict(data_test)
#预测概率
test_predicted_pr = knn.predict_proba(data_test)
#绘制混淆矩阵并可视化
print(metrics.classification_report(test_y,test_predicted))
cm_plot(test_y,test_predicted).show()

女性约会对象分类(多分类)

"""
女性约会对象分类(多分类)
"""
import pandas as pd

def cm_plot(y,yp):
    from sklearn.metrics import confusion_matrix 
    import matplotlib.pyplot as plt
    
    cm = confusion_matrix(y, yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',
                         verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt
'''
数据预处理
1:不喜欢
2:一般魅力
3:极具魅力
'''
data = pd.read_csv(r'/Users/dx/Desktop/Python数据分析与机器学习/7.KNN算法/KNN对女性约会对象分类案例/dating.txt',
                   sep = '\t')
data.head()

'''
数据标准化
'''
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()
data['每年获得的飞行常客里程数'] = scale.fit_transform(data[['每年获得的飞行常客里程数']])
data['玩视频游戏所消耗的时间百分比'] = scale.fit_transform(data[['玩视频游戏所消耗的时间百分比']])
data['每周消费的冰淇淋公升数'] = scale.fit_transform(data[['每周消费的冰淇淋公升数']])


'''
数据切分
'''
from sklearn.model_selection import train_test_split

X_whole = data.drop('类别', axis = 1)
y_whole = data.类别 

x_train, x_test, y_train,y_test = \
    train_test_split(X_whole, y_whole, test_size = 0.2, random_state = 0)

'''
使用sklearn中的KNN模块
'''
from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors= 13)
knn.fit(x_train,y_train)

knn.score(x_train,y_train)
train_predicted = knn.predict(x_train)

#绘制混淆矩阵,并可视化
from sklearn import metrics
print(metrics.classification_report(y_train,train_predicted))
cm_plot(y_train,train_predicted).show()

'''
使用测试集数据进行预测
'''
test_predicted = knn.predict(x_test)
print(metrics.classification_report(y_test,test_predicted))
cm_plot(y_test,test_predicted)
相关标签: 基础算法 KNN