机器学习(一)之KNN算法

knn算法原理

①.计算机将计算所有的点和该点的距离

②.选出最近的k个点

③.比较在选择的几个点中那个类的个数多就将该点分到那个类中

KNN算法的特点:

knn算法的优点:精度高,对异常值不敏感,无数据假设

knn算法的缺点:时间复杂度和空间复杂度都比较高

knn算法中遇到的问题及其解决办法

1、当样本不平衡时,比如一个类的样本容量很大,其他类的样本容量很小,输入一个样本的时候,K个临近值中大多数都是大样本容量的那个类,这时可能就会导致分类错误。改进方法是对K临近点进行加权,也就是距离近的点的权值大,距离远的点权值小。 

2、计算量较大,每个待分类的样本都要计算它到全部点的距离,根据距离排序才能求得K个临近点,改进方法是:先对已知样本点进行剪辑,事先去除对分类作用不大的样本。

knn算法数据范围:数值型和标称型

注意:数据是二维的,第一维表示样本,第二维表示特征(如手写数字算法,)

标称型:标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类)

数值型:数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)

knn算法的应用

案例:

import numpy as np
import pandas as pd
# KNeighborsClassifer 用于分类问题的处理
from sklearn.neighbors import KNeighborsClassifier

# 导入数据:

movie = pd.read_excel("./data/movies.xlsx",sheet_name=1)
movie

#根据电影的武打镜头和接吻镜头的数量判断电影的类型

#knn算法是有监督学习,需要样本训练数据,和目标值进行对照

提取数据:

x = movie.iloc[:,1:3] 

y = movie["分类情况"]

# 此时K值等于5,即5个邻居
knn=KNeighborsClassifier(n_neighbors=5)

# 训练算法:fit()以X为训练数据,y为目标值拟合模型

 knn.fit(x,y)                   

#数据进行l训练,已经建立了一个分类标准  

 

#添加2个样本数据

x_text = pd.DataFrame({"武打镜头":[120,10],"接吻镜头":[5,80]})                     

# 使用算法预测目标样本的分类情况

knn.predict(x_text)                 

预测结果:

array(['动作片', '爱情片'], dtype=object)             

#从结果可以看出:第一个样本被划分到动作片中,第二个样本被划分到爱情片中 

         

 #对样本进行估计被划分到哪个类的概率

knn.predict_proba(x_text)                                 

估计结果结果:array([[0.6, 0.4], [0.4, 0.6]])

 

注意:knn算法是根据距离远近进行分类的划分,K为最近的样本。

 当训练数据样本不均衡是,对数据处理的办法

给knn加权重,即weight = ["uniform","distance","calllable"]                 即:均衡、距离、自定义

如:

knn=KNeighborsClassifier(n_neighbors=5,weights="distance")

 

 

算法的保存和算法的加载

当我们对算法进行了训练之后,想要再次使用该算法进行预测时,就不需要再次进行算法的训练了,直接使用保存的算法,对需要进行分类的样本进行分类就行

 

#算法保存

#应用模块

from sklearn.externals import joblib

#存储样本的方式:

joblib.dump(knn,filename = "./digit_detector.m") 

#filename后边自定义后缀为m的文件名             

 

#算法的加载

from sklearn.externals import joblib

#加载之前保存的算法

knn = joblib.load("./digit_detector.m")

posted @ 2019-01-23 14:30  石桥浪子  阅读(1071)  评论(0编辑  收藏  举报