1 K-means
首先看看迭代1次时聚类中心的位置:
再看看迭代10次后聚类中心的位置:
标记数据聚类中心:
# 给每一个数据样本标记其聚类中心
def findClosestCentroids(X, centroids):
m = X.shape[0]
K = centroids.shape[0]
temp = np.zeros(m*K).reshape(K,m)
# 遍历聚类中心,逐个计算与训练集之间的距离
for i in range(K):
# 求列值之和
temp[i,:] = np.sum((X-centroids[i,:])**2,axis=1)
# 找到距离最小所对应的行号
idx = np.argmin(temp, axis=0)
return idx
计算聚类均值,移动聚类中心:
# 计算聚类均值,移动聚类中心
def computeCentroids(X, idx, K):
m,n = X.shape
centroids = np.zeros(K*n).reshape(K,n)
for i in range(K):
# 求行值的平均值
centroids[i,:] = np.mean(X[idx == i,:],axis=0)
return centroids
如果初始化选择的位置不好,会出现局部最优解:
我们可以多次尝试随机初始化,然后选择最优结果:
# 随机初始化
def kMeansInitCentroids(X, K):
centroids = np.zeros(K*X.shape[1]).reshape(K,X.shape[1])
randidx = range(X.shape[0])
# 随机打乱顺序
random.shuffle(randidx)
centroids = X[randidx[:K], :]
return centroids
2 PCA
运行了PCA算法对数据进行特征维度压缩,然后进行反压缩,会产生数据丢失,正如图中蓝点与红点:
使用PCA进行降维,即使维度降低较多,差异性也能够得到很好的保留。
我们可以对比一下下面两个图片,它们的特征维度分别为1024和100:
原图片,特征维度:1024 反压缩后的图片,特征维度:100特征的均值归一:
# 均值归一
def featureNormalize(X):
mu = np.mean(X,axis=0)
sigma = np.std(X,axis=0)
X_norm = 1.0*(X - mu)/sigma
return X_norm,mu,sigma
PCA计算过程:
# PCA计算
def pca(X):
m,n = X.shape
# 计算协方差
C = 1.0/m*X.T.dot(X)
# 特征值赋值给evalues,对应特征向量赋值给evectors
evalues,evectors = np.linalg.eig(C)
# 特征值从大到小排列,返回数组索引
sorted_indices = np.argsort(-evalues)
# 特征向量按特征值大小从左到右排列
sorted_evectors = evectors[:,sorted_indices]
sorted_evalues = evalues[sorted_indices]
return sorted_evectors,diag(sorted_evalues),sorted_evalues
特征映射:
# 特征映射
def projectData(X, U, K):
Z = X.dot(U[:,:K])
return Z
数据反压缩:
# 数据反压缩
def recoverData(Z, U, K):
X_rec = Z.dot(U[:,:K].T)
return X_rec
文章转载自公众号:止一之路
网友评论