python写算法不好

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python写算法不好相关的知识,希望对你有一定的参考价值。

基于以下三个原因,我们选择Python作为实现机器学习算法的编程语言:(1) python的语法清晰;(2) 易于操作纯文本文件;(3) 使用广泛,存在大量的开发文档。

可执行伪代码

Python具有清晰的语法结构,大家也把它称作可执行伪代码(executable pseudo-code)。默认安装的Python开发环境已经附带了很多高级数据类型,如列表、元组、字典、集合、队列等,无需进一步编程就可以使用这些数据类型的操作。使用这些数据类型使得实现抽象的数学概念非常简单。此外,读者还可以使用自己熟悉的编程风格,如面向对象编程、面向过程编程、或者函数式编程。

Python语言处理和操作文本文件非常简单,非常易于处理非数值型数据。Python语言提供了丰富的正则表达式函数以及很多访问Web页面的函数库,使得从html中提取数据变得非常简单直观。

Python比较流行

Python语言使用广泛,代码范例也很多,便于读者快速学习和掌握。此外,在开发实际应用程序时,也可以利用丰富的模块库缩短开发周期。

在科学和金融领域,Python语言得到了广泛应用。SciPy和NumPy等许多科学函数库都实现了向量和矩阵操作,这些函数库增加了代码的可读性,学过线性代数的人都可以看懂代码的实际功能。另外,科学函数库SciPy和NumPy使用底层语言(C和Fortran)编写,提高了相关应用程序的计算性能。本书将大量使用Python的NumPy。

Python的科学工具可以与绘图工具Matplotlib协同工作。Matplotlib可以绘制2D、3D图形,也可以处理科学研究中经常使用到的图形,所以本书也将大量使用Matplotlib。

Python开发环境还提供了交互式shell环境,允许用户开发程序时查看和检测程序内容。

Python开发环境将来还会集成Pylab模块,它将NumPy、SciPy和Matplotlib合并为一个开发环境。在本书写作时,Pylab还没有并入Python环境,但是不远的将来我们肯定可以在Python开发环境找到它。

Python语言的特色

诸如MATLAB和Mathematica等高级程序语言也允许用户执行矩阵操作,MATLAB甚至还有许多内嵌的特征可以轻松地构造机器学习应用,而且MATLAB的运算速度也很快。然而MATLAB的不足之处是软件费用太高,单个软件授权就要花费数千美元。虽然也有适合MATLAB的第三方插件,但是没有一个有影响力的大型开源项目。

Java和C等强类型程序设计语言也有矩阵数学库,然而对于这些程序设计语言来说,最大的问题是即使完成简单的操作也要编写大量的代码。程序员首先需要定义变量的类型,对于Java来说,每次封装属性时还需要实现getter和setter方法。另外还要记着实现子类,即使并不想使用子类,也必须实现子类方法。为了完成一个简单的工作,我们必须花费大量时间编写了很多无用冗长的代码。Python语言则与Java和C完全不同,它清晰简练,而且易于理解,即使不是编程人员也能够理解程序的含义,而Java和C对于非编程人员则像天书一样难于理解。

所有人在小学二年级已经学会了写作,然而大多数人必须从事其他更重要的工作。

——鲍比·奈特

也许某一天,我们可以在这句话中将“写作”替代为“编写代码”,虽然有些人对于编写代码很感兴趣,但是对于大多数人来说,编程仅是完成其他任务的工具而已。Python语言是高级编程语言,我们可以花费更多的时间处理数据的内在含义,而无须花费太多精力解决计算机如何得到数据结果。Python语言使得我们很容易表达自己的目的。

Python语言的缺点

Python语言唯一的不足是性能问题。Python程序运行的效率不如Java或者C代码高,但是我们可以使用Python调用C编译的代码。这样,我们就可以同时利用C和Python的优点,逐步地开发机器学习应用程序。我们可以首先使用Python编写实验程序,如果进一步想要在产品中实现机器学习,转换成C代码也不困难。如果程序是按照模块化原则组织的,我们可以先构造可运行的Python程序,然后再逐步使用C代码替换核心代码以改进程序的性能。C++ Boost库就适合完成这个任务,其他类似于Cython和PyPy的工具也可以编写强类型的Python代码,改进一般Python程序的性能。

如果程序的算法或者思想有缺陷,则无论程序的性能如何,都无法得到正确的结果。如果解决问题的思想存在问题,那么单纯通过提高程序的运行效率,扩展用户规模都无法解决这个核心问题。从这个角度来看,Python快速实现系统的优势就更加明显了,我们可以快速地检验算法或者思想是否正确,如果需要,再进一步优化代码。
参考技术A Python解释器做了许多工作来抽象底层得计算单元(包括CPU 各种内存 总线)操作,所以当我们使用Python时,从不用担心为数组分配内存得问题,也不用管内存管理得问题。

但这也是把双刃剑,有好也有坏。

首先,Python对于底层操作得抽象使得vectorization(向量化)计算性能提升方法,不能一步实现。在纯Python代码中,我们不能除以元素均为float类型数据得列表,只能每次除以其中得一个元素,这就是不能向量化。当然,这个问题可以通过使用类似Numpy这样得外部库添加向量化操作来解决。

其次,Python对于底层操作得抽象使得基于使用L1/L2层cache来存储数据用于下次运算的性能优化方法不能实现。因为python得garbage_collect机制,使得数据在内存中不得到最优排列,这产生了许多内存碎片,进而会引发以下这种情况,如果某次数据传递完全利用了bus得带宽,但因为内存碎片造成了一次原算所需数据得缺失,所以本次运算会被丢弃,还要至少再重发一次数据,这就造成了数据发送时间得延长,也会造成性能下降。

然后是Python的动态类型和不被编译。许多静态语言,比如C,首先会对代码进行编译,而在编译阶段,编译器会使用很多技巧来最优化所生成得中间代码以及变量存储在内存中得排列方式(比如结构体中得边界对齐).而纯Python代码虽然也进行编译,但不会像C语言编译那样进行存储优化,而且更糟糕得是,其动态特征使得对原生Python代码得优化难以进行,因为在运行过程中python代码不断变化。但现在有一些方法来减轻这种问题对于性能得影响,首先想到得是Cextension,这个第三方模块让Python可以被编译。

最后,是大家最熟悉得GIL(全局线程琐),这使得纯Python代码在使用多线程技术时,不能利用当前最流行得多核CPU,极大得影响了其计算性能。不过,这个问题可以通过使用multiprocessing模块来首先进行多进程操作,或使用Cextension等其他方法来克服这个问题
参考技术B 一、 决策树优点

1、决策树易于理解和解释,可以可视化分析,容易提取出规则。

2、可以同时处理标称型和数值型数据。

3、测试数据集时,运行速度比较快。

4、决策树可以很好的扩展到大型数据库中,同时它的大小独立于数据库大小。

二、决策树缺点

1、对缺失数据处理比较困难。

2、容易出现过拟合问题。

3、忽略数据集中属性的相互关联。

4、ID3算法计算信息增益时结果偏向数值比较多的特征。

三、改进措施

1、对决策树进行剪枝。可以采用交叉验证法和加入正则化的方法。

2、使用基于决策树的combination算法,如bagging算法,randomforest算法,可以解决过拟合的问题

三、应用领域

企业管理实践,企业投资决策,由于决策树很好的分析能力,在决策过程应用较多。

KNN算法

一、KNN算法的优点

1、KNN是一种在线技术,新数据可以直接加入数据集而不必进行重新训练

2、KNN理论简单,容易实现

二、KNN算法的缺点

1、对于样本容量大的数据集计算量比较大。

2、样本不平衡时,预测偏差比较大。如:某一类的样本比较少,而其它类样本比较多。

3、KNN每一次分类都会重新进行一次全局运算。

4、k值大小的选择。

三、KNN算法应用领域

文本分类、模式识别、聚类分析,多分类领域

支持向量机(SVM)
参考技术C python写算法不好;首先,Python对于底层操作得抽象使得vectorization(向量化)计算性能提升方法,不能一步实现。 参考技术D Python写算法不好的原因如下:对于底层操作得抽象使得vectorization(向量化)计算性能提升方法,不能一步实现。在纯Python代码中,我们不能除以元素均为float类型数据得列表,只能每次除以其中得一个元素,这就是不能向量化。当然,这个问题可以通过使用类似Numpy这样得外部库添加向量化操作来解决。其次,Python对于底层操作得抽象使得基于使用L1/L2层cache来存储数据用于下次运算的性能优化方法不能实现。pythongarbage_collect机制,使得数据在内存中不得到最优排列,这产生了许多内存碎片,进而会引发以下这种情况,如果某次数据传递完全利用了bus得带宽,但因为内存碎片造成了一次原算所需数据得缺失,所以本次运算会被丢弃,还要至少再重发一次数据,这就造成了数据发送时间得延长,也会造成性能下降。祝您生活愉快,谢谢提问😊

写不好 SQL? 送你一个大招

点击蓝色“有关SQL”关注我哟

加个“星标”,天天与10000人一起快乐成长

这两天一直在看《推荐系统实战》。书中提到基于用户行为推荐算法的时候,提到一个场景,其实用 SQL 来解,也非常容易。

已知场景是这样的,某视频网站收集了用户观影数据:

{
    "电影":"你好,李焕英",
    "上市日期":"2021-02",
    "观影者":{
        {"姓名":"小林", "年龄":22,"购买日期":"2021-02-18","票价":98,"地址":"陆家嘴星美影院"},
         {"姓名":"小李", "年龄":21,"购买日期":"2021-02-16","票价":92,"地址":"万达星美影院"},
          {"姓名":"小北", "年龄":24,"购买日期":"2021-02-19","票价":96,"地址":"五角场星美影院"},
           {"姓名":"小民", "年龄":22,"购买日期":"2021-02-18","票价":98,"地址":"陆家嘴星美影院"}
        
    },
    
    "电影":"速度与激情9",
    "上市日期":"2021-05",
    "观影者":{
        {"姓名":"小林", "年龄":22,"购买日期":"2021-05-20","票价":98,"地址":"陆家嘴星美影院"},
         {"姓名":"小李", "年龄":21,"购买日期":"2021-05-21","票价":92,"地址":"万达星美影院"},
          {"姓名":"小北", "年龄":24,"购买日期":"2021-05-22","票价":96,"地址":"五角场星美影院"} 
        
    }
    
    ...
}

网站需要根据品味和观影历史,向用户推荐其他影片。

两个人的品味是否相近,依据年龄是否相仿,并不能最好地做出判断。但如果两人观影记录重叠,品味相近的概率就大很多。基于此,就可以互相推荐对方还未看过的电影了。

这个时候,用什么样的编程方式,来计算观影重叠,就值得商榷了

有人说用Python, 轻便简易;有人说用 Java,库多不愁;还有人说c++, 性能贼快。

作为 SQL 博主,当然推荐 SQL, 这种集合类计算,SQL 是把快刃。对于举棋不定的朋友,你一定是缺少数据建模思维,正所谓:心中有模型,则SQL自然成

为什么我一直推荐金融,财会,产品的朋友,都要学一学SQL, 学一学集合理论,原因就在这。SQL 理念有助于你理解现实中的思维逻辑,成为5分钟看透世界本质的人

所有工作中遇到的逻辑分析难题,都可以借助SQL来完成。下面这段话,建议你读三遍:

SQL 在手,人无我有。数据再大,我用SQL!

注意:SQL 在这里,一定要读 "色扣"。

那么怎么培养自己的数据建模思维呢?如下详细来说。

依据上面的观影日志记录,经过 ETL 裁剪,可得到观影记录如下:

 

ETL(Extract Transform Load) , 负责把数据转换成SQL可操作的格式。

此时,推荐问题就转换成了:哪两个人的观影重叠次数最多。

最终,问题就化解为简单的SQL题, Group by .... Order By... 模式:



SELECT  观看者1, 观看者2,COUNT(DISTINCT 电影) AS 电影数量
FROM tblUserFilms
GROUP BY 观看者1, 观看者2
ORDER BY 观看者1,COUNT(DISTINCT 电影) DESC 

由此可推导,与他/她同好的人,可能还喜欢对方的其他爱好。

那么,怎么才能生成如下两两组合,求观影重叠次数的数据模型呢?

 

很显然,要把原始数据打散,打平,破除原先不符合三范式的结构:

 

这个时候,最小粒度的数据模型就出来了,影片 + 观看者,没有有重复记录,也没有粘连的记录。

实现这一步,最常规的思维就是拆字符串, 可以自定义函数实现,也可以利用系统自带的函数。比如SQL Server中就有 string_split函数:


select
    act.Film,
    usr.*
from
    dbo.UserFilms act
    OUTER APPLY (
        SELECT
            *
        FROM
            String_Split(act.Watcher, ',') tmp
    ) usr
    
    

最后一步,是真正揭开本次算法的关键,也是我平常运用最多的一个思维,无中生有。

单列观影者,怎么才能组合成双列观影者呢?

 

很多教材,都有涉及 Join 这个主题。大多数一直在强调相等性 join, 对于不等性和半等性 Join, 重视不多。所以很多初学者自然不知道,Join 其实可以用 <> 来连接:


;

with base_query as (
    select
        act.Film,
        usr.*
    from
        dbo.UserFilms act
        OUTER APPLY (
            SELECT
                *
            FROM
                String_Split(act.Watcher, ',') tmp
        ) usr
),
base_query_com as (
    select
        act.Film,
        act.value as Watcher,
        act1.value as Watcher2
    from
        base_query act
        inner join base_query act1 on act1.Film = act.Film
        and act1.value <> act.value
)
select
    Watcher,
    Watcher2,
    COUNT(DISTINCT Film) as Films
from
    base_query_com
group by
    Watcher,
    Watcher2
order by
    Watcher,
    Films DESC
    

这里着重注意不等性 Join 的表达:

  inner join base_query act1 on act1.Film = act.Film
        and act1.value <> act.value

最终,顺利完成两两聚合求最多的运算:

 

这个例子在平时工作中,非常具有典型性。用图再展示下一步步的思考流程:

 

在这里,有两步模型的转换值得记录:打破范式约束(打散粘连的字符串)和 不等性 Join.

每一步模型的转换,都可以沉淀出来一个套路,累积这些套路,你将会有一个强大的兵器库,来拆解各类逻辑问题。

工作刚开始的那几年,我一直热衷于编码,求多没求精,想来也是唏嘘。刷题固然重要,但刻意积累,才是最快地精通技艺的方法呢!真希望20岁时有人告诉我这些。

--完--

往期精彩:

本号精华合集(三)

外企一道 SQL 面试题,刷掉 494 名候选人

我在面试数据库工程师候选人时,常问的一些题

零基础 SQL 数据库小白,从入门到精通的学习路线与书单

以上是关于python写算法不好的主要内容,如果未能解决你的问题,请参考以下文章

Dijkstra算法

KMP算法

银行家算法的python代码实现,感觉python写算法简直要起飞

Anaconda简介

使用 Python PIL 的隐写算法

Python进阶:递归算法