k-均值与PCA
k-均值
K-均值是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。
K-均值是一个迭代算法,假设我们想要将数据聚类成n个组,其方法为:
首先选择K个随机的点,称为聚类中心(cluster centroids);
对于数据集中的每一个数据,按照距离K个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。
计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。
重复步骤2-4直至中心点不再变化。
样本数据
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as sio
from scipy.optimize import minimize
import pandas as pd
from sklearn.svm import SVC
"""
1获取每个样本所属类别
"""
def fnd_centroids(x,centros):
idx=[]
for i in range(len(x)):
#x[i] 1x2数组 centros是 kx2的数组
dist =np.linalg.norm((x[i]- centros),axis=1)#dis 1xk
id_i=np.argmin(dist)
idx.append(id_i)
return np.array(idx)
"""
2.计算聚类中心点
"""
def compute_centros(X,idx,k):
centros =[]
for i in range(k):
centros_i = np.mean(x[idx == i],axis=0)
centros.append(centros_i)
return np.array(centros)
"""
3.运行kmeans,重复执行1和2
"""
def run_kmeans(x,centros,iters):
k = len(centros)
centros_all =[]
centros_all.append(centros)
centros_i = centros
for i in range(iters):
idx = fnd_centroids(x,centros_i)
centros_i = compute_centros(x,idx,k)
centros_all.append(centros_i)
return idx,np.array(centros_all)
"""
绘制数据集和聚类中心的移动轨迹
"""
def plot_data(X,centros_all,idx):
plt.figure()
plt.scatter(X[:,0],X[:,1],c