机器学习之近邻算法模型(KNN)

1.、导引

如何进行电影分类

众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪 个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问 题。没有哪个电影人会说自己制作的电影和以前的某部电影类似,但我们确实知道每部电影在风格 上的确有可能会和同题材的电影相近。那么动作片具有哪些共有特征,使得动作片之间非常类似, 而与爱情片存在着明显的差别呢?动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们 不能单纯依靠是否存在打斗或者亲吻来判断影片的类型。但是爱情片中的亲吻镜头更多,动作片中 的打斗场景也更频繁,基于此类场景在某部电影中出现的次数可以用来进行电影分类。

本章介绍第一个机器学习算法:K-近邻算法,它非常有效而且易于掌握。

2.、k-近邻算法原理

简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。

  • 优点:精度高、对异常值不敏感、无数据输入假定。
  • 缺点:时间复杂度高、空间复杂度高。
  • 适用数据范围:数值型和标称型。

工作原理

存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们 只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。 最后 ,选择K个最相似数据中出现次数最多的分类,作为新数据的分类

回到前面电影分类的例子,使用K-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,下图显示了6部电影的打斗和接吻次数。假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用K-近邻算法来解决这个问题。

3.、在scikit-learn库中使用k-近邻算法

  • 分类问题:from sklearn.neighbors import KNeighborsClassifier
  • 回归问题:from sklearn.neighbors import KNeighborsRegressor

0)一个最简单的例子

身高、体重、鞋子尺码数据对应性别

# 导入KNN 分类算法
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
# !!! 样本中,男女比例应该1:1
data = np.array([[175,70,43],[180,75,44],[165,50,38],[163,48,37],[170,68,42],[168,52,40]])
target = np.array(['男','男','女','女','男','女'])
# 声明算法
knn = KNeighborsClassifier(n_neighbors=5)
# 使用算法,进行学习,训练
knn.fit(data,target)
# 使用算法,进行预测数据
data_predict = np.array([[188,90,46],[166,55,38],[169,65,41]])
knn.predict(data_predict)

1)用于分类

导包,机器学习的算法KNN、数据蓝蝴蝶

# 使用KNN算法,对一种花,进行分类
# 数据源在sklearn中

import sklearn.datasets as datasets
# 使用datasets中的方法,导入数据
# data属性:花萼长度,花萼宽度,花瓣长度,花瓣宽度
# 鸢尾花分三类 :'target_names': array(['setosa', 'versicolor', 'virginica'], dtype='<U10')}
iris = datasets.load_iris()

data = iris['data']
target = iris['target']
# numpy 将数据打乱顺序
# shuffle 随机打乱顺序,data ,target两个都需要打乱顺序
# 随机种子,每次和每次都不同,所以,随机数的时候,每次和每次都不同
# np.random.shuffle()
# np.random.seed(8)
# np.random.randint(0,150,size = 1)
# 只能使用一次
np.random.seed(11)
np.random.shuffle(data)
np.random.seed(11)
np.random.shuffle(target)
#训练样本
# 150个样本,分成两份,140个(训练数据),10个(预测)

# 获取了140个训练数据
X_train = data[:140]
y_train = target[:140]

# 预测数据
X_test = data[140:]
y_test = target[140:] #真实答案

knn = KNeighborsClassifier(n_neighbors=5)

# 第一步,训练
knn.fit(X_train,y_train)

# 第二步,预测
# 返回自己的“观点”
# 一般情况下,机器学习返回结果 添加:_
y_ = knn.predict(X_test)

print('鸢尾花分类真实情况是:',y_test)

print('鸢尾花机器学习分类情况是: ',y_)

# 通过结果,看到,机器学习,将最后这10未知的数据,全部预测准确

# 计算算法的准确率
score = knn.score(X_test,y_test)
print('算法的准确率: ', score)
  • 使用pandas数据类型进行操作
#机器学习的数据可以是numpy也可以是pandas

import pandas as pd
from pandas import Series,DataFrame

#先将训练数据转换为pandans类型数据
X_train_df = DataFrame(X_train,columns=['speal length','speal width','petal length','petal width'])
y_train_s = Series(y_train)

#将测试测试数据转为pandas数据
X_test_df = DataFrame(X_test,columns=['speal length','speal width','petal length','petal width'])
y_test_s = Series(y_test)

knn = KNeighborsClassifier(10)
knn.fit(X_train_df,y_train_s)

y_ = knn.predict(X_test_df)
print(y_test_s.values)
print(y_)
  • 训练数字

4、KNN手写数字识别

import numpy as np
# bmp 图片后缀
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.neighbors import KNeighborsClassifier

digit = plt.imread('./data/3/3_200.bmp')
# 28 * 28 很小
# 首先将图片放大显示
plt.figure(figsize=(2,2))
plt.imshow(digit,cmap = 'gray')
  • 批量获取数据
# 批量获取数据
data = []
target = []

for i in range(10):
    for j in range(1,501):
#         plt.imread('./data/3/3_200.bmp')
#         digit是二维的数组,黑白
        digit = plt.imread('./data/%d/%d_%d.bmp'%(i,i,j))
        data.append(digit)

#         目标值
        target.append(i)
# data 和target 5000个数据
len(data)
# 将机器学习的数据转换成ndarry,操作起来比较方便
# ndarray 提供了很多方法
data = np.array(data)
target = np.array(target)

print(data.shape,target.shape)
#显示正确值及图片,仅供测试
index = np.random.randint(0,5000,size = 1)[0]

print('该索引所对应的目标值: ',target[index])

digit = data[index]
plt.figure(figsize=(2,2))
plt.imshow(digit,cmap = 'gray')
  • 打乱数据,生成学习队列
seed = np.random.randint(0,5000,size = 1)[0]

# 指明随机数的种子,打乱顺序
np.random.seed(seed)
np.random.shuffle(data)

# 指明的种子和上面的一样,打乱顺序的规则就和上面一样
np.random.seed(seed)
np.random.shuffle(target)
# 验证一下,顺序是否匹配
index = np.random.randint(0,5000,size = 1)[0]

print('该索引所对应的目标值: ',target[index])

digit = data[index]
plt.figure(figsize=(2,2))
plt.imshow(digit,cmap = 'gray')
  • 机器学习,分割数据
knn = KNeighborsClassifier(n_neighbors=20)
# 最后保留50个数据作为预测数据集
# 训练数据
X_train,y_train = data[:4950],target[:4950]
# 测试数据
X_test,y_test = data[-50:],target[-50:]
  • 因算法只能接受二维数据,故学习和预测的数据都需要转化为二维数据
X_train = X_train.reshape((4950,784))

# 正着数像素784像素点,倒着数-1
X_test = X_test.reshape((50,-1))
  • 训练
# 第一步进行训练
knn.fit(X_train,y_train)
  • 预测
# 第二步,使用算法,进行预测
y_ = knn.predict(X_test)

print('真实数据:',y_test)
print('预测数据: ',y_)
  • 将五十条数据画出来
# 可视化,将50张绘制出来

plt.figure(figsize=(2*5,3*10))

for i in range(50):

#     10行5列
#     子视图,在每一个子视图中绘制图片
    subplot = plt.subplot(10,5,i+1)

#     最后50张图片在 X_test中
#     !!! 像素点需要reshape成图片形状
    subplot.imshow(X_test[i].reshape((28,28)))

#     添加标题,True:0
#               Predict:0
#     y_test ----真实
#     y_  ------预测
    t = y_test[i]
    p = y_[i]
    subplot.set_title('True: %d\nPredict:%d'%(t,p))

获取网络上的数字图片进行识别

  • 读取图片转化为灰度
digits = plt.imread('./数字.jpg')
digits = digits.mean(axis = 2)
plt.imshow(digits,cmap = 'gray')
  • 将图片中的数字切片切下来
data_pre = digits[175:240,78:143]
plt.imshow(data_pre,cmap = 'gray')
  • 将图片转为28*28
import scipy.ndimage as ndimage
data_pre_test = ndimage.zoom(data_pre,zoom = (28/65,28/65))
print(data_pre_test.shape)

plt.figure(figsize=(2,2))
plt.imshow(data_pre_test,cmap = 'gray')
  • 机器预测
# 从网络上获取的数据,有时候,因为写数字,和样本不同,误差可能会很大
knn.predict(data_pre_test.reshape((1,-1)))
knn.predict(data_pre_test.reshape((1,784)))

5、保存模型

# 保存模型
# knn 算法,模型,estimator
# 数学建模,model 算法
from sklearn.externals import joblib
# 保存
joblib.dump(knn,'数字识别.m')
# 提取算法
knn_digits = joblib.load('./数字识别.m')
#使用模型
knn_digits.predict(data_pre_test.reshape((1,-1)))

原文地址:https://www.cnblogs.com/bigox/p/11476948.html

时间: 2024-11-06 23:34:00

机器学习之近邻算法模型(KNN)的相关文章

k近邻算法(knn)与k-means算法的对比

k近邻算法(knn)是一种基本的分类与回归的算法,k-means是一种基本的聚类方法. k近邻算法(knn) 基本思路:如果一个样本在特征空间的k个最相似(即特征空间最邻近)的样本大多数属于某一类,则该样本也属于这一类. 影响因素: k值的选择.k的值小,则近似误差小,估计误差大:k的值大,则近似误差大,估计误差小.(近似误差即算法在训练集上的误差,估计误差即算法在测试集上的误差.近似误差小,会出现过拟合的现象,即模型在训练集上预测误差小,在未知的测试集上则表现差,此时模型并非最优模型:估计误差

机器学习十大算法之KNN(K最近邻,k-NearestNeighbor)算法

机器学习十大算法之KNN算法 前段时间一直在搞tkinter,机器学习荒废了一阵子.如今想重新写一个,发现遇到不少问题,不过最终还是解决了.希望与大家共同进步. 闲话少说,进入正题. KNN算法也称最近邻居算法,是一种分类算法. 算法的基本思想:假设已存在一个数据集,数据集有多个数值属性和一个标签属性,输入一个新数据,求新数据的标签. 步骤如下: 先将新数据拷贝n份,形成一个新的数据集: 逐行计算新数据集与原数据集的距离: 按距离长度排序后,统计前K个数据里,那个标签出现的次数最多,新数据就标记

K 近邻算法(KNN)与KD 树实现

KD树节点 /// <summary> /// KD树节点 /// /2016/4/1安晟添加 /// </summary> [Serializable] public class KDTreeNode { /// <summary> /// 获取或设置节点的空间坐标 /// </summary> public double[] Position { get; set; } /// <summary> /// 获取或设置分裂维度的索引 /// G

机器学习实战(一)kNN

$k$-近邻算法(kNN)的工作原理:存在一个训练样本集,样本集中的每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对于关系.输入没有标签的新数据后,将新数据的每一个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签.一般来说,我们只选择样本数据集中前 $k$ 个最相似的数据,这就是$k$-近邻算法中$k$的出处,通常$k$是不大于20的整数.最后,选择$k$个最相似的数据中出现次数最多的分类,作为新数据的分类. 1.  Putting the

R语言学习笔记—K近邻算法

K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适合分类,也适合回归.KNN算法广泛应用在推荐系统.语义搜索.异常检测. KNN算法分类原理图: 图中绿色的圆点是归属在红色三角还是蓝色方块一类?如果K=5(离绿色圆点最近的5个邻居,虚线圈内),则有3个蓝色方块是绿色圆点的"最近邻居",比例为3/5,因此绿色圆点应当划归到蓝色方块一类:如果

机器学习之利用KNN近邻算法预测数据

前半部分是简介, 后半部分是案例 KNN近邻算法: 简单说就是采用测量不同特征值之间的距离方法进行分类(k-Nearest Neighbor,KNN) 优点: 精度高.对异常值不敏感.无数据输入假定 缺点:时间复杂度高.空间复杂度高 1.当样本不平衡时,比如一个类的样本容量很大,其他类的样本容量很小,输入一个样本的时候,K个临近值中大多数都是大样本容量的那个类,这时可能就会导致分类错误.改进方法是对K临近点进行加权,也就是距离近的点的权值大,距离远的点权值小. 2.计算量较大,每个待分类的样本都

【黎明传数==&gt;机器学习速成宝典】模型篇04——k近邻法【kNN】(附python代码)

目录 什么是k近邻算法 模型的三个基本要素 构造kd树 搜索kd树 Python代码(sklearn库) 什么K近邻算法(k-Nearest Neighbor,kNN) 引例 假设有数据集,其中前6部是训练集(有属性值和标记),我们根据训练集训练一个KNN模型,预测最后一部影片的电影类型. 首先,将训练集中的所有样例画入坐标系,也将待测样例画入 然后计算待测分类的电影与所有已知分类的电影的欧式距离 接着,将这些电影按照距离升序排序,取前k个电影,假设k=3,那么我们得到的电影依次是<He's N

机器学习-KNN近邻算法

参看文章: <机器学习-周志华> <机器学习实战-Peter Harrington> <统计学习方法-李航> 算法介绍: k近邻学习是一种常用的监督学习方法,其工作机制如下,给定测试样本,基于某种距离度量(曼哈顿距离.欧氏距离.切比雪夫距离.Lp距离.Minkowski距离)找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测. argmax(f(x))是使得 f(x)取得最大值所对应的变量点x 投票法: 在分类任务中使用,选择k个样本出现最多的

机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocessing.py import numpy as np class StandardScaler: def __init__(self): self.mean_ = None self.scale_ = None def fit(self, X): """根据训练数据集X获得数据的均