Machine-Learning 编程作业
Programming Exercise 7:Kmeans and PCA
Part1 . K-means 聚类
Part2. K-means 算法对图片降维
Part3. 调用Sklearn库实现K-means算法
Part4. PCA算法对二维数据进行降维
Part5. PCA算法对图像进行降维处理
K-means 聚类
算法思想:以空间中K个点为中心进行聚类,对最靠近他们的对象归为相同类。然后通过迭代的方法逐次更新各聚类中心的值,直至得到最好的聚类结果。
算法描述:
- 适当选择K个初始中心点;
- 在第n次迭代中,对任意一个样本,求其到K个中心的距离,将该样本归到距离最关的中心所在的类;
- 利用均值等方法更新该类的中心值;
- 对于所有的K各聚类中心,如果利用(2),(3)的迭代方法更新后值保持不变时,或迭代一定次数之后,结束迭代,输出结果。
导入数据可视化
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.io import loadmat
data = loadmat('data/ex7data2')
X = data['X']
data2 = pd.DataFrame(data['X'], columns=['X1', 'X2'])
print(data2.head())
fig, ax = plt.subplots(figsize=(6,4))#定义图的大小
ax.scatter(data2['X1'],data2['X2'] , s=5, c='b', marker='o', label='Examples')
ax.legend()#在图形中加入颜色不同的备注
ax.set_xlabel('X1')
ax.set_ylabel('X2')
plt.show()
结果如下:
定义初始聚类中心,归类,并迭代
#方法1: 人为规定初始聚类中心
# initial_center = np.array([[3, 3], [6, 2], [8, 5]])
#方法2: 随机初始化聚类中心
def init_center(X, k):
m, n = X.shape
center = np.zeros((k, n))
idx = np.random.randint(0, m, k)
for i in range(k):
center[i, :] = X[idx[i], :]
return center
initial_center = init_center(X, 3)
#对所有样本求出其所属的类
def find_center(X, center):
m = X.shape[0]
k = center.shape[0]
idx = np.zeros(m)
for i in range(m):
mdis = 10000
for j in range(k):
dist = np.sum((X[i, :] - center[j, :]) ** 2 )
if dist < mdis:
mdis = dist
idx[i] = j
return idx #存储m个样本对应的最近的聚类中心序号
idx = find_center(X, initial_center)
print(idx[0:5])
#对已分好的类,利用均值更新该类的中心点
def compute_center(X, idx, k):
m, n = X.shape
center = np.zeros((k, n))
for i in range(k