# 课堂

机器学习\approx 构建映射函数

有精确解,用逻辑和规则判断就可以实现的任务,不需要机器学习

# 实验

# 实验 1:聚类算法 ——K-Means 聚类实现图像压缩

# 原理

用所属的中心像素点代替该点的像素值

# 和 KNN 区别

# 库函数

sklearn.cluster.KMeans

参数名含义
max_iter最大的迭代次数,一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环
n_init因为 k means 无法达到全局最优,每次收敛到最后的结果是局部最优,所以就需要跑很多次独立初始化的 k means,比如说 n_init=10 就是跑 10 次。然后从这 10 次里面选最优的那个

# 实现

  1. 选择初始化的 k 个样本作为初始聚类中心 [公式] ;
  2. 针对数据集中每个样本 [公式] 计算它到 k 个聚类中心的距离并将其分到距离最小的聚类中心所对应的类中;
  3. 针对每个类别 [公式] ,重新计算它的聚类中心 [公式] (即属于该类的所有样本的质心);
  4. 重复上面 2 3 两步操作,直到达到某个中止条件(迭代次数、最小误差变化等)

K-means

# 问题

  1. 数据预处理

ValueError: Found array with dim 3. Estimator expected <= 2.

  1. 图像显示
    1. show () 显示图像报错

      plt.show(a)
      Traceback (most recent call last):
        File "<input>", line 1, in <module>
        File "/opt/anaconda3/envs/lw/lib/python3.7/site-packages/matplotlib/pyplot.py", line 378, in show
          return _backend_mod.show(*args, **kwargs)
      TypeError: __call__() takes 1 positional argument but 2 were given

      要连用才行

      plt.imshow(a)
      plt.show()
    2. 图片一片空白

      Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

      要加上 dtype='uint8'

# 结果

kmeans.cluster_centers_

print(kmeans.cluster_centers_)
输入是 input.shape [0]*input.shape [1],kmeans.cluster_centers_是聚类中心 R G B 上的值等于多少,尺寸是 n_clusters*input.shape [1]
[[174.59467573,173.9901819,246.47991983],
 [215.45924078,76.42704187,100.72538369],
 [159.38710248,139.29507143,160.30628807],
 [249.35679673,248.26811526,251.05609561],
 [87.40492626,72.22305713,86.55090552],
 [113.11388756,112.1817089,203.23946966],
 [146.91317821,143.60447382,212.30169223],
 [248.19245195,180.68551076,187.3944757 ],
 [118.54429719,105.51514341,149.6448077 ],
 [243.88331598,110.09551082,230.80163138],
 [165.35426109,78.88623474,83.79991084],
 [206.57153277,185.39844094,191.02305156],
 [248.65960002,228.93569235,221.84770989],
 [227.78167473,123.24980063,147.12926105],
 [44.5955711,44.99189217,49.34032634],
 [213.22590777,205.30466609,242.65299695]]

kmeans.labels_

print(set(kmeans.labels_.tolist()))
查看标签取值
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}

# 参考链接

https://blog.csdn.net/weixin_44010678/article/details/87189722

# 实验 2:降维 / 特征提取 ——PCA 降维

内容:使用 PCA 实现图像降维,并进行特征的可视化;对比 lbp 和 PCA 特征的可视化结果;

数据集:ORL 人脸识别数据集、自建数据集(从公开数据集中抽取几千张图像组建实验用数据集)

lbp 特征提取代码提供 matlab 版本,PCA 和 lbp 降维后特征向量长度都很小,比较方便可视化。

# 数据集

使用的是:ORL_32_32.mat
O RL 人脸数据集,包含 4 00 张人脸图像,每张图像为 3 2*32 大小的灰度图,连续的 1 0 张图像为同一个人(如 1 10 为第一个人)。 为了可视化方便,本实验选择前 1 00 张图像进行实验。

dict_keys(['__header__', '__version__', '__globals__', 'gnd', 'fea'])
(400, 1)
(400, 1024)
data = read('ORL_32_32.mat')
gnd = data['gnd']
fea = data['fea']
plt.imshow(fea[0].reshape((32,32)).T)
plt.show()

# sklearn.decomposition.PCA

接口

from sklearn.decomposition import PCA
import numpy as np
def pca(data, dim=0):
# 数据 降维大小(mle 为 auto)
    if dim == 0:
        dim = 'mle'
    pca_ = PCA(n_components=dim)
    # 降维数据
    after_data = pca_.fit_transform(data)
	# 协方差矩阵
    cov_matritx = pca_.get_covariance()
    # 特征值计算
    lambda_EA = np.linalg.eigvals(cov_matritx)
    return after_data, after_data.shape, lambda_EA

如果不 fit 在先,会报错:io.imshow (pca.get_covariance ())

# PCA 的算法步骤

PCA 的算法步骤:

设有 m 条 n 维数据。

  1. 将原始数据按列组成 n 行 m 列矩阵 X;
  2. 将 X 的每一行进行零均值化,即减去这一行的均值;
  3. 求出协方差矩阵 [公式]
  4. 求出协方差矩阵的特征值及对应的特征向量;
  5. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k 行组成矩阵 P;
  6. [公式] 即为降维到 k 维后的数据。

【机器学习】降维 ——PCA(非常详细)

# 应用人脸识别

# 参考链接

PCA(人脸识别中的应用 —— 特征脸)

# 实验 3:KNN、SVM 图像分类

内容:使用 PCA、lbp 进行特征提取,分别使用 KNN、linear classifier、SVM、简单全连接网络进行图像分类。给出不同分类器、超参数设置下的实验结果,并进行分析。

数据集:自建数据集

实验要求:除实验给出的代码之外,不允许调用机器学习包(但是允许调用 matplot 等可视化、数据处理包),编程语言不限(python、matlab 均可)。

提交内容:实验报告 + 源代码

考核标准:学生自主完成实验内容,提交实验报告(包括算法原理概述、实现方法、实验结果),通过与标准结果对比判断实验结果是否合理,并在实践结束时集中答辩随机回答相关问题。


更新于

请我喝[茶]~( ̄▽ ̄)~*

牛奶草莓小饼干 微信支付

微信支付

牛奶草莓小饼干 支付宝

支付宝

牛奶草莓小饼干 贝宝

贝宝