二叉树算法Python(二)+机器学习概念问题(二)

前言:以前有一个疑问,世上这么多知识,怎么学的玩?这么多算法,怎么记得住?后来发现,不在于你去记多少,而是你在理解和运用过程中形成的思维能力和习惯,这个很有价值。

最近的博客可能每天都有点小更新,算是日记一样的吧,今天是二叉树(二)和机器学习概念问题(二)

  • 二叉树层次遍历
    其实,在上一篇中已经用队列层次添加元素到二叉树,那么遍历也很简单了,接着上次代码

    
    def level_que(self,root):
        if root.value==None:
            return
        else:
            que=[]
            que.append(root)
            while que:
                node=que.pop(0)
                print(node.value)
                if node.lchild!=None:
                    que.append(node.lchild)
                if node.rchild!=None:
                    que.append(node.rchild)
  • 二叉树的镜像
    用的递归,就是对根节点,交换左右子树,然后对下级子节点执行上述操作

    
    def exchange(self,root):
        temp=root.lchild
        root.lchild=root.rchild
        root.rchild=temp
        return root
    def mirror(self,root):
        if root==None:
            return
        else:
            self.exchange(root)
            self.mirror(root.lchild)
            self.mirror(root.rchild)
            return root
  • 利用中序+前序/后序得到BTree,关键在于找父节点

    def fro_mid2tree(fro,mid):
        if len(fro)==0:
            return
        point=mid.index(fro[0])
        lchild=fro_mid2tree(fro[1:point+1],
                                  mid[0:point])
        rchild=fro_mid2tree(fro[point+1:],
                                  mid[point+1:])        
        return Node(fro[0],lchild,rchild)
    
  • 主成分分析,PCA

    大家第一反应是,不就是协方差矩阵得到特征向量,然后将原来的样本向量映射到新的低维空间么,步骤很简单:

    输入:样本集 X={x1,x2,…,xm};
    过程:
    (1)对所有样本进行中心化
    (2)计算样本的协方差矩阵
    (3)对协方差矩阵做特征分解
    (4)取最大的d个特征值所对应的特征向量w1,w2,…,wd。
    输出:投影矩阵W=(w1,w2,…,wd)

    我就问一句,为什么用协方差矩阵特征向量去映射而不是别的向量?
    能回答这个问题的人应该比较少。

    答案:最优化算出来的,比如样本feature是8维的,我现在想用4维空间来表示,在这种约束条件下,最小化信息损失,恰好算出来就是大家用的特征向量映射(还有一种思路,就是新维度下方差最大化-信息量最大化,结果一样)
    PCA对样本进行降维,而尽量不损失信息,算一种数据预处理。

    为什么这么做,因为很多时候会出现维度爆炸,另一方面,即使不是维度爆炸,较少的feature意味着过拟合风险小一些和计算容易一些。

    以下有几个东西都会出现协方差矩阵或者说样本矩阵与转置相乘的这个东西(原谅我,latex敲公式我真不熟练,实在需要我再敲)。

  • SVD奇异分解

    至于为什么扯上这个熟悉的矩阵,都(PCA,LDA,SVM)是因为在最优化求解的时候不可避免的得到样本矩阵x与其转置的乘积,中间产物。

    这里首先说下方阵的分解,大家应该对线性代数有点了解,方阵可以分解为特征向量和特征值来表示。特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么。

    那非方阵咋办,所以对应的就是奇异值分解SVD,讲一个M*N的矩阵分解为M*r,r*r,r*N相乘的矩阵,然后根据奇异值(特征值的算术平方根)的大小去筛选,选取r,往往可以得到较小的r,但是信息损失极小。

    (1)最直观的用处是信息存储!
    比如M=100000,N=10000,r=100,可以计算下省下了多少存储空间,且往往信息保留了绝大部分,比如图像存储。

    (2)还有推荐系统
    推荐系统中,常见的是将M*N分解为M*r与r*N的乘积,而往往M*N矩阵是残缺的,比如表示M个用户对N个商品的购买情况,那么后面两个矩阵元素就是需要学习的参数,而目标函数就是矩阵相乘的到元素与M*N矩阵原来元素的差异最小化,用的比较多的是二次误差(经常加上L2正则,以及一些变种);

    上面得到两个矩阵,第一个M*r矩阵可以得到各个用户的vector,那么就可以计算用户相似度,那么A和B相似度很高,A买了啥,就可以推荐给B,名曰UserCF;

    第二个r*N的矩阵,可以得到N个商品的vector,那么可以计算商品相似度,你买了F,那么可以给你推荐相似的商品G,名曰ItemCF;

    那么你会发现有一个参数r如何确定,好像据说一般都是经验和试探(说白了就是“连猜带蒙”)

    (3)还有潜在语义分析LSI
    比如如果上述M表示文档的数量,N表示字典词汇数量,那么M*N矩阵就是文档和词汇的关系,分解后的三个矩阵一般这么说,M*r表示文章和主题的关系,r*r表示主题和词汇意义的关系,r*N表示词汇语义和单词之间的关系;

    发现没,这里没有需要尝试的参数,r可以根据奇异值大小选择,比如前面10个奇异值占据总奇异值的99%,那r就取10吧,为啥?因为你多取几个,复原的矩阵信息相差不大

    这时候你得到了两个矩阵(左奇异、右奇异),可以看做文档和词汇的vector,有了vector(features)能做啥?比如说聚类一哈,你就可以发现一些文档和单词跑在了一起,以后人们搜索的时候,直接看搜索词在哪个范围就可以按照聚类信息进行推荐;

    一减少我们的检索、存储量(小矩阵),因为这样压缩的文档集合和PCA是异曲同工的,二可以提高我们的用户体验,用户输入一个词,我们可以在这个词的近义词的集合中去找

  • LDA线性判别分析,以及SVM的kernel函数

    特征值这东西,真是无处不在。
    话说,LDA还是两个东西,LDA(Latent Dirichlet Allocation)和(Linear Discriminant Analysis, LDA)
    先说LDA主题模型。大家想象一下这个操作:第一种骰子有r面(每一面的概率可能不一样),对应r个第二种骰子,每个骰子有N个面。你扔一次第一种骰子,得到某一面,上面写着“医疗”,你拿着“医疗”的第二种骰子,再扔一次,得到某一个词,…重复100次,你得到一篇文章,重复M次,你得到M个文章。

    反过来你可以根据文章-词汇矩阵,去估计上述两种骰子(每一面的概率参数),具体的细节推导我还没怎么看细致,所以此处暂时还不能深入浅出了,抱歉,什么pLSA和LDA….

    至于SVM的核函数,这个很简单,在推导SVM公式的时候,样本i与样本j向量的内积这一项,假设每个样本vector可以通过某种映射函数得到新空间下的vector,你以为这个映射坐标的函数就是核函数么?NO!
    如果原始空间下的样本i和j的内积是A,新空间下的内积为B,A到B的这个映射函数就是核函数。

    因此核函数的要求是映射之后的矩阵半正定。为啥,因为样本内积矩阵是半正定的。

  • 今天就说这么多吧,哎哟,老肥羊差点,newbee你的决赛打的是个瘠薄

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在数据结构与算法中,DS算法通常指的是使用Python编写的数据结构和算法代码。Python是一种简洁而强大的编程语言,广泛应用于数据科学、机器学习和人工智能等领域。在Python中,有许多内置的数据结构和算法库,例如列表(list)、字典(dictionary)、集合(set)、排序算法、查找算法等等。 要学习DS算法Python编程,你可以从以下几个方面入手: 1. 熟悉Python的基本语法和常用的数据结构,例如列表、字典等。这将为你在编写DS算法时提供基础。 2. 学习Python中的算法和数据结构库,例如numpy、pandas和scikit-learn等。这些库提供了许多高效的算法和数据结构实现,可以帮助你更快地解决问题。 3. 阅读和理解常见的数据结构和算法Python实现。例如,你可以学习二叉树、链表、堆栈、队列等数据结构,以及排序算法、查找算法、图算法等。 4. 练习编写和调试DS算法Python代码。可以通过在线编程平台、算法竞赛和编程练习题来提高自己的编程技能。 通过不断学习和实践,你将能够掌握DS算法Python编程技巧,并提高自己的编码能力。希望以上信息对你有所帮助!<span class="em">1</span> #### 引用[.reference_title] - *1* [leetcode中国-DS-Algorithms-Python:DS-算法-Python](https://download.csdn.net/download/weixin_38603219/19905640)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值