美文网首页互联网科技每天写1000字程序员
机器学习笔记034 | K-means 和 PCA 的代码实现

机器学习笔记034 | K-means 和 PCA 的代码实现

作者: 止一量化养家 | 来源:发表于2017-10-17 08:13 被阅读50次

    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
    

    文章转载自公众号:止一之路

    相关文章

      网友评论

        本文标题:机器学习笔记034 | K-means 和 PCA 的代码实现

        本文链接:https://www.haomeiwen.com/subject/tzozyxtx.html