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) |
结果: