K近邻识别图片

在本篇文章中我们使用sklearn中自带的手写数字数据集(digits),这个数据集中并没有图片,而是经过提取得到的手写数字特征和标记,就免去了我们的提取数据的麻烦,但是在实际的应用中是需要我们对图片中的数据进行提取的

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_digits
import pandas as pd
import matplotlib.pyplot as plt

# 1: 数据获取 scrapy
digits = load_digits()
# print(digits,type(digits))
# print(digits['DESCR'])
X = digits['data']
y = digits['target']
# print(X,X.shape)
# print(y,y.shape)
# 显示第35张图的特征值和目标值
# digit = X[35]
# digit_image = digit.reshape(8,8)
# plt.imshow(digit_image)
# plt.show()
# print(y[35])
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.25,random_state=1)
from sklearn.neighbors import KNeighborsClassifier
# 超参数: 机器模型在训练之前必须指定的参数  n_neighbors weights
# 模型参数:算法训练的过程中学习的参数. KNN没有模型参数,只有超参数
#  y = w * x + b ===> w,b 就是模型参数
knn = KNeighborsClassifier(n_neighbors=20,weights="distance")
# 模型训练
knn.fit(X_train,y_train)
y_predict = knn.predict(X_test)
print('命中率', knn.score(X_test,y_test))

PCA主成分分析

在很多机器学习算法的复杂度和数据的维度有着密切的关系,甚至与维数呈现指数级关联。在图形图像中机器学习处理成千上万甚至几十万的维度的情况也并不罕见,在这种情况下,机器学习的资源消耗是不可接收的,因此我们必须对数据进行降维处理

  1. 主要用于数据的降维 通过降维,可以发现更便于人类理解的特征
  2. 其它应用:可视化,去噪音
  3. 降维当然意味着信息的丢失,不过鉴于实际数据本身通常存在相关性,我们可以想办法在降维的同时将信息的损失尽量降低

一些相关性案例

  1. “浏览量”和”访客数” 往往具有较强的相关性
  2. “下单数”和”成交数” 也具有较强的相关性
  3. “学历”和”学位” 具有较强的相关性

采用PCA降维提示运算效率

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split

plt.rcParams['font.sans-serif']=['SimHei']

digits = datasets.load_digits()
X = digits['data']
y = digits['target']
# n_components=64 ==> 正确率为: 0.98888
# n_components=2  特征保留百分比为: 28%    正确率为: 60%
# n_components=30   特征保留百分比为: 95%    正确率为: 0.9933  思考为什么会超过n_components=64的情况
pca = PCA(n_components=2) # 直接降低到30特征值
X = pca.fit_transform(X)
# # 它代表降维后的各主成分的方差值占总方差值的比例(从大到小排序),这个比例越大,则越是重要的主成分
pevr = pca.explained_variance_ratio_
print(f'每个特征方差为{pevr},降维后的特征数量为{len(pevr)},保留特征百分比为{np.sum(pevr)}')
# # 做一个折线图,完成对方差值的从大到小显示操作
plt.plot([i for i in range(X.shape[1])],[np.sum(pca.explained_variance_ratio_[:i+1]) for i in range(X.shape[1])])
plt.xlabel('特征数量')
plt.ylabel('特征存留百分比')
# 如果取前30个特征值,保留之前大约90%的结果
plt.show()

X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=1)
print(X_train.shape)
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train,y_train)
y_predict = knn.predict(X_test)
print(knn.score(X_test,y_test))