第四次毕业设计任务书

  1. 1.  你本周完成内容。

本周做数据的预处理,本次有两个方向,

第一个是用pca算法进行预处理,进行降维

第二方向是通过k-mean算法进行处理,想法是利用聚类分析中 的K-means算法对训练集进行预处理(在第二次任务中有说明)

  1. 2.  接下来7周的安排。

时间

内容

4.2-4.8

进行k-mean算法处理数据,完成上周遗留的bug,写读书笔记。

4.9-4.15

开始写毕业论文,继续编写毕设代码。

4.16-4.22

大致程序可以运行。

4.23-4.29

继续编写毕设程序,修改细节部分,完成毕业论文初稿。

4.30-4.29

完善毕业论文和毕业设计

4.30-5.6

完善毕业设计和论文

5.6-5.12

毕业论文定稿和准备答辩

 

  1. 3.  算法描述

主成分分析(Principal Components Analysis)的数学公式和原理已在上次的任务书中有详细描述,这里为伪代码描述

第一步:求均值。求平均值,然后对于所有的样例,都减去对应的均值

第二步:求特征协方差矩阵

第三步:求协方差的特征值和特征向量

第四步:将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵.

第五步:将样本点投影到选取的特征向量上。 假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m*n),协方差矩阵是n*n,选取的k个特征向量组成的矩阵为EigenVectors(n*k).那么投影后的数据FinalData为: FinalData(m*k) = DataAdjust(m*n) * EigenVectors(n*k)。

 

K-mean算法描述

选择K个点作为初始质心  

repeat  

    将每个点指派到最近的质心,形成K个簇  

    重新计算每个簇的质心  

until 簇不发生变化或达到最大迭代次数  

 

4.你本周实现代码,贴图核心代码,并注释。

pca主要代码

def pca(dataMat, K=65535):  # dataMat是原始数据,一个矩阵,K是要降到的维数

    dataMat = mat(dataMat)
    # print(dataMat)
    meanVals = mean(dataMat, axis=0)  # 第一步:求均值
    meanRemoved = dataMat - meanVals  # 减去对应的均值
    # print(meanRemoved)
    covMat = cov(meanRemoved, rowvar=0)  # 第二步,求特征协方差矩阵
    # print(covMat)
    eigVals, eigVects = linalg.eig(mat(covMat))  # 第三步,求特征值和特征向量
    # print(eigVects,eigVals)
    eigValInd = argsort(eigVals)  # 第四步,将特征值按照从小到大的顺序排序
    eigValInd = eigValInd[: -(K + 1): -1]  # 选择其中最大的K个
    redEigVects = eigVects[:, eigValInd]  # 然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵.

    lowDDataMat = meanRemoved * redEigVects  # 第五步,将样本点投影到选取的特征向量上,得到降维后的数据

    reconMat = (lowDDataMat * redEigVects.T) + meanVals  # 还原数据
    # # contribution = self.calc_single_contribute(eigVals, eigValInd)  # 计算单维贡献度,总贡献度为其和
    return lowDDataMat, reconMat

 

 

 k-mean主要代码

def kmeans(dataSet, k):
    numSamples = dataSet.shape[0]
 
    clusterAssment = np.mat(np.zeros((numSamples, 2)))
    clusterChanged = True

   
## step 1: init centroids
    centroids = initCentroids(dataSet, k)

    while clusterChanged:
        clusterChanged = False
       
## for each sample
        for i in range(numSamples):
            minDist = 100000.0  # 与最近族群距离
            minIndex = 0  # 所属族
            ## for each centroid
            ## step 2: find the centroid who is closest
            for j in range(k):
                distance = euclDistance(centroids[j, :], dataSet[i, :])
                print(distance)
                if distance < minDist:  # 更新最小距离,所属族
                    minDist = distance
                    minIndex = j

                    ## step 3: update its cluster
            if clusterAssment[i, 0] != minIndex:  # 所属族群有变化
                clusterChanged = True
               
clusterAssment[i, :] = minIndex, minDist ** 2  # 族群索引号,距离

        ## step 4: update centroids
        for j in range(k):
            test1 = clusterAssment[:, 0]  # 获取所属族群
            test2 = clusterAssment[:, 0].A  # 转换为数组
            test3 = clusterAssment[:, 0].A == j  # 判断是否属于族群J
            test4 = np.nonzero(test3)  # 属于族群J的索引值
            test5 = test4[0]
            test6 = dataSet[test5]
            pointsInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A == j)[0]]
            #             pointsInCluster = dataSet[nonzero(clusterAssment[:, 0].A == j)[0]]
            centroids[j, :] = np.mean(pointsInCluster, axis=0)  # 所有族群元素特征值求平均

    print('Congratulations, cluster complete!')
    return centroids, clusterAssment

 

5.你本周实现效果截图。

 

 

本次实验使用numpy包。显示数据自动省略,上图为经过pca算法后还原数据,下图为降维数据

 

 

6.你本周小结

本周主要是pca算法,后发现k-mean算法或许会更好一些,本周已完成k-mean算法,下周进行调试,和修改

在本周编写过程中,数据量有些大,pc测试时,效率很低,下周想使用数据库,将数据放入,看是否能够提高io效率

下周要对算法中对特征值选取的方法进行改进

 

7.本周参考

    1. http://deeplearning.stanford.edu/wiki/index.php/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90
    2. http://blog.csdn.net/qll125596718/article/details/8243404/
posted @ 2017-04-01 21:00  Banz  阅读(233)  评论(1编辑  收藏  举报