K-means Clustering
导入模块
| 1 | import numpy as np | 
Implementing K-means
Finding closet centroids
- 读入数据
| 1 | data=loadmat('ex7data2.mat') | 
- 为每个样本找到最近的聚类中心
$c^{(i)} :=j \quad$ that minimizes $\quad\left|x^{(i)}-\mu_{j}\right|^{2}$
| 1 | #========================找聚类中心 | 
可以自己初始化一组聚类中心来测试一下
| 1 | init_centroids = np.array([[3, 3], [6, 2], [8, 5]]) | 
结果应该是
| 1 | [0 2 1] | 
Computing centroids means
| 1 | #=========================移动聚类中心 | 
K-means on example dataset
- 画图函数
| 1 | def plot_data(X,centroids,idx=None): | 
- 画出聚类中心移动过程
| 1 | #=============================聚类中心移动过程 | 
结果:

Random initialization
关于聚类中心的初始化,一个更好的方法是从样本集中随机选取。
| 1 | #==============================随机初始化聚类中心 | 
最后再尝试一下聚类算法:
| 1 | for i in range(3): | 
得到最终结果:

Image compression with K-means
- 导入数据
| 1 | img=io.imread('bird_small.png') | 
图像为

| 1 | (128,128,3) | 
可以看到图像以3维矩阵的方式存储,前面两个维度代表图像的像素点个数128x128,最后一个维度代表像素点由RGB三个通道表示。又因为一个通道占用8-bit,因此在原始的图像中一个像素点需要24-bit来储存。
在这幅图中包含了上千种种颜色,而在这个实验中,我们把颜色降为16种,也就是说,一像素点只需要4bit就足够了。
| 1 | img=img/255 | 
比对一下压缩效果:

Principle Component Analysis
- 导入模块
| 1 | import numpy as np | 
Example Dataset
- 导入数据
| 1 | data = loadmat('ex7data1.mat') | 
| 1 | (50,2) | 
- 显示图像:

Implementing PCA
关于PCA的数学原理可以参考:浅谈SVD的数学原理及应用
PCA主要分为两个计算步骤:
- 计算数据的协方差矩阵:$\Sigma=\frac{1}{m} \sum_{i=1}^{n}\left(x^{(i)}\right)\left(x^{(i)}\right)^{T}$
- 用SVD函数进行奇异值分解
在开始上面的步骤之前,需要先对数据进行特征缩放和归一化:
| 1 | def feature_normalize(X): | 
PCA:
| 1 | #===================================PCA | 
可视化主成成分:
| 1 | def plot_reduce(means, U, S): | 
得到结果:

Dimensionality Reduction with PCA
Projecting the data onto the principal components
| 1 | ''' | 
| 1 | K = 1 | 
得到结果:
| 1 | array([1.48127391]) | 
Reconstructing an approximation of the data
| 1 | #===================================重建数据 | 
| 1 | # you will recover an approximation of the first example and you should see a value of | 
| 1 | array([-1.04741883, -1.04741883]) | 
Visualizing the projections
| 1 | #====================================PCA样本投影可视化 | 
结果如图:

Face Image Dataset
- 导入数据
| 1 | data_2=loadmat('ex7faces.mat') | 
- 数据可视化
| 1 | def plot_face(X,row,col): | 
结果如图:

PCA on Faces
| 1 | X_2_norm,means_2=feature_normalize(X_2) | 
显示主成成分
| 1 | plot_face(U[:,:36].T, 6, 6) | 
结果如下:

Dimensionality Reduction
把图片降维
| 1 | Z_2=project_data(X_2_norm,U_2,K=36) | 
结果:

 
        