众所周知,电影能够按照题材分类,然而题材自己是如何定义的?由谁来断定某部电影属于哪 个题材?也就是说同一题材的电影具备哪些公共特征?这些都是在进行电影分类时必需要考虑的问 题。没有哪一个电影人会说本身制做的电影和之前的某部电影相似,但咱们确实知道每部电影在风格 上的确有可能会和同题材的电影相近。那么动做片具备哪些共有特征,使得动做片之间很是相似, 而与爱情片存在着明显的差异呢?动做片中也会存在接吻镜头,爱情片中也会存在打斗场景,咱们 不能单纯依靠是否存在打斗或者亲吻来判断影片的类型。可是爱情片中的亲吻镜头更多,动做片中 的打斗场景也更频繁,基于此类场景在某部电影中出现的次数能够用来进行电影分类。python
本章介绍第一个机器学习算法:K-近邻算法,它很是有效并且易于掌握。git
简单地说,K-近邻算法采用测量不一样特征值之间的距离方法进行分类。算法
存在一个样本数据集合,也称做训练样本集,而且样本集中每一个数据都存在标签,即咱们知道样本集中每一数据 与所属分类的对应关系。输人没有标签的新数据后,将新数据的每一个特征与样本集中数据对应的 特征进行比较,而后算法提取样本集中特征最类似数据(最近邻)的分类标签。通常来讲,咱们 只选择样本数据集中前K个最类似的数据,这就是K-近邻算法中K的出处,一般K是不大于20的整数。 最后 ,选择K个最类似数据中出现次数最多的分类,做为新数据的分类。数组
回到前面电影分类的例子,使用K-近邻算法分类爱情片和动做片。有人曾经统计过不少电影的打斗镜头和接吻镜头,下图显示了6部电影的打斗和接吻次数。假若有一部未看过的电影,如何肯定它是爱情片仍是动做片呢?咱们可使用K-近邻算法来解决这个问题。 网络
身高、体重、鞋子尺码数据对应性别app
# 导入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)
导包,机器学习的算法KNN、数据蓝蝴蝶dom
# 使用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)
#机器学习的数据能够是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_)
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')
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)))
# 保存模型 # 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)))