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

机器学习之近邻算法模型(KNN)
1.、导引
如何进⾏电影分类
众所周知,电影可以按照题材分类,然⽽题材本⾝是如何定义的?由谁来判定某部电影属于哪个题材?也就是说同⼀题材的电影具有哪些公共特征?这些都是在进⾏电影分类时必须要考虑的问题。没有哪个电影⼈会说⾃⼰制作的电影和以前的某部电影类似,但我们确实知道每部电影在风格上的确有可能会和同题材的电影相近。那么动作⽚具有哪些共有特征,使得动作⽚之间⾮常类似,⽽与爱情⽚存在着明显的差别呢?动作⽚中也会存在接吻镜头,爱情⽚中也会存在打⽃场景,我们不能单纯依靠是否存在打⽃或者亲吻来判断影⽚的类型。但是爱情⽚中的亲吻镜头更多,动作⽚中的打⽃场景也更频繁,基于此类场景在某部电影中出现的次数可以⽤来进⾏电影分类。
本章介绍第⼀个机器学习算法:K-近邻算法,它⾮常有效⽽且易于掌握。
2.、k-近邻算法原理
简单地说,K-近邻算法采⽤测量不同特征值之间的距离⽅法进⾏分类。
优点:精度⾼、对异常值不敏感、⽆数据输⼊假定。
缺点:时间复杂度⾼、空间复杂度⾼。
适⽤数据范围:数值型和标称型。
⼯作原理
存在⼀个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每⼀数据与所属分类的对应关系。输⼈没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进⾏⽐较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。⼀般来说,我们只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不⼤于20的整数。最后,选择K 个最相似数据中出现次数最多的分类,作为新数据的分类。
回到前⾯电影分类的例⼦,使⽤K-近邻算法分类爱情⽚和动作⽚。有⼈曾经统计过很多电影的打⽃镜头和接吻镜头,下图显⽰了6部电影的打⽃和接吻次数。假如有⼀部未看过的电影,如何确定它是爱情⽚还是动作⽚呢?我们可以使⽤K-近邻算法来解决这个问题。
3.、在scikit-learn库中使⽤k-近邻算法
分类问题:ighbors import KNeighborsClassifier
回归问题:ighbors import KNeighborsRegressor
0)⼀个最简单的例⼦
⾝⾼、体重、鞋⼦尺码数据对应性别
# 导⼊KNN 分类算法
ighbors 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)
blt# 只能使⽤⼀次
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
ighbors import KNeighborsClassifier
digit = plt.imread('./data/3/3_200.bmp')
# 28 * 28 很⼩
# ⾸先将图⽚放⼤显⽰
plt.figure(figsize=(2,2))
plt.imshow(digit,cmap = 'gray')
批量获取数据
鸟苷酸# 批量获取数据arma
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 = shape((4950,784))
# 正着数像素784像素点,倒着数-1
X_test = shape((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 = an(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 = (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_shape((1,-1)))
knn.predict(data_shape((1,784)))
5、保存模型
# 保存模型
# knn 算法,模型,estimator
# 数学建模,model 算法
als import joblib
# 保存
joblib.dump(knn,'数字识别.m')
# 提取算法
knn_digits = joblib.load('./数字识别.m')
#使⽤模型
knn_digits.predict(data_shape((1,-1)))

本文发布于:2024-09-21 21:55:04,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/326071.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   算法   电影   学习   分类   机器
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议