精华内容
下载资源
问答
  • 硬核干货,史上最强获取GitHub所有仓库内容数据分析教程
    万次阅读 多人点赞
    2019-09-20 10:41:00

    Github上聚集了世界上很多优秀的工程师,团队和优秀的开源项目,事实上也是聚集了软件行业相当一部分的思考和实践。分析Github上的数据无疑是一件非常有意义和价值的事情,下图就是我所使用的方法绘制的GitHub license 词云,先一睹为快吧。
    在这里插入图片描述
    同时我觉得以Github数据为基础,写一写相关的软件论文还是非常的容易,目前这方面的题材也不多。

    有很多的公众号以及文章介绍了Github上的各种趋势以及热门项目,当然使用的方法绝大多数是基于爬虫的。事实上,有无数的程序员,在学习爬虫技术之后可能会拿GitHub进行练手,分析GitHub上的数据,不信你可以在GitHub上搜一遍。至此你可能认为本文介绍的是爬虫,当然不是,已经有那么多爬虫文章,我也没必要再多搞一篇。因为我思考了一下爬虫的方法至少存在以下四个主要问题:

    (1),爬虫的数据不全,通常只取页面中某几项的信息。多数爬虫的文章只是讲述了原理,要想对于GitHub这种级别的网站进行全面的爬取,面临的困难重重。说起来爬虫的本质就是一条HTTP请求,但是工程实现并不简单。

    (2),爬取的数据不够详细,即使爬取到了fork的数量,还是没有办法知道这些fork数量是2018年还是2019年发生的事情。

    (3),个人即使爬取到较多的数据,存储检索如此巨大的数据都会存在很多的问题。

    (4),GitHub上时刻都有事件发生,要维持频繁更新并不容易。

    因此我所介绍的并不是不爬虫,所介绍的是直接获取Github上所有活动数据的四种方法。

    (1),有的方法可以下载本地离线分析,对于个人用户数据格式检索不方便。

    (2),有的方法可以存成数据库在本地,对于个人用户数据量大,TB级数据,存储是一个问题,检索也不够快。

    (3),云数据库的方法在存储和检索方面有优势,但是不能够完全的自动化操作。

    (4),如何使用云数据库的API去完成自动化操作,看起来不错。

    授人以鱼不如授人以渔,本文将上述几种分析GitHub数据的方法分享出来,希望大家在了解本文的方法后能做更多有价值的事情。

    上述方法逐层递进,每一种方法都有其优势和不足之处,可以按照自己的需求选取适合自己的方法,然后你写可以在公众号或者博客中分析Github上如下一些有趣的事情,如下:

    (1),GitHub 中哪种语言以及 License 的项目最多?

    (2),你的母校,所在公司在 GitHub 开源贡献排名,bat排名如何,中国在 GitHub 开源贡献排名?

    (3),程序员提交代码背后的黑话都有哪些,commit记录和issue中里面出现最高的词汇是什么?

    (4),GitHub 上有多少独立仓、多少独立提交、多少独立开发者?

    (5),哪些大神在 GitHub上的贡献最多,哪些项目被 star,Fork 的次数最多?

    (6),开源是程序员之间的社交,隐藏在他们背后的黑话都有哪些呢?

    (7),github中哪种语言的项目最多,哪种license的项目最多?这在诸多公司开源治理中可能用得到,如果你使用了GPL license的项目,那要小心了。

    (8),伊朗开发者被移除github,是怎么做到的

    (9),评论里面出现最高的词汇是什么?

    (10),github中所有的python开源项目中, 哪个模块的引用最多?或者java项目中哪个jar包的引用次数最多?

    (11),按照时间的粒度分析github的趋势,例如一个小时,一天,一个月,甚至一年。例如在这个时间段内产生了多少次commit,star,fork等等。

    我只是选取了一些话题,你还可以分析其他的一些有趣的事情。很多基于Github的推荐基本都可以采用本文的方法。在学习完本文方法之后你也可以像一些公众号那样定期发布 GitHub 的一些趋势走向了,当然关于github的种种你都都可以按照自己的意愿去查询,gitchub中隐藏着大量的财富等待你去挖掘。

    下面到了最重要的部分,具体方法我在Gitchat 《原来你是这样的 GitHub》上进行了撰写,这里,账号和我的博客同名 村中少年 。

    下图亮出一张某个项目的issue title词云以及一个统计词云,可以提前看下:
    在这里插入图片描述
    大家可以猜猜是哪一个项目,应该很容易被猜到。还等什么,赶快行动起来吧。

    本文为CSDN村中少年原创文章,转载记得加上原创出处,博主链接这里

    更多相关内容
  • 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。 第二篇:Transport层介绍,主要介绍...

    一. 声明


    本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

    第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

    第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

    第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等

    第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。

    第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)

    第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等

    第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

    第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

    另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

    ------------------------------------------------------------------------------------------------------------------------------------------

    CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

    蓝牙交流扣扣群:970324688

    Github代码:https://github.com/sj15712795029/bluetooth_stack

    入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

    ------------------------------------------------------------------------------------------------------------------------------------------
     

    二. 前言

    首先在介绍以下内容之前,我们先来介绍下我们的CSDN课程,以下介绍内容都会在 CSDN课程 手把手教你蓝牙协议栈入门(点击我)中第二小节介绍。

    三. Wireshark/Frontline/Ellisys工具的使用

    1. Wireshark的使用

    我们随便打开一个用我们协议栈为例,打开界面如下:

     

    我个人是把Wireshark分为以下几个部分

    1)菜单栏位

    2)工具栏位

    3)视图栏位

    4)选中包汇总栏位

    5)选中包raw data栏位

    我们分别来介绍下以上栏位

    1)菜单栏位,菜单栏位没啥好讲的,我主要说下着色规则吧,因为你可能用Wireshark打开可能没有颜色,所以对各个HCI数据包类型区分的不是很清晰

    选择视图->着色规则

     

    要勾选对应的协议,然后打开视图->着色分组列表。就可以了

    2)工具栏位,没啥好讲的,就是菜单栏位的一些快捷按钮,可以按照自己的喜好加进来

    3)视图栏位,视图栏位我们有以下几个要说明的

    ①过滤功能

    可以看到着色规则的地方有规律关键字

     

    比如我们先看下HCI command,那么我们敲下bthci_cmd,会过滤出来hci command

     

    还有很多过滤的命令,具体看着色器关键字

    ②协议数据包

    显示整个流程的封包,可以点击某一个封包会在视图④视图⑤中具体显示内容

    4)选中包汇总栏位

     

    5)选中包raw data栏位

     

    2. Frontline的使用

    Frontline工具其实有很多型号,就蓝牙而言比如有抓air log sniffer的,有抓HCI log的(需要接线到蓝牙芯片TX,RX,通过夹子接都蓝牙芯片飞出来的线)

    我们此部分来讲通过Frontline来打开btsnoop,首先安装完Frontline后会显示以下几个内容

    目前我们只是用到Capture File Viewer.把btsnoop文件直接拖到Carture File Viewer就行了,打开效果如图所示:

    在看btsnoop的时候一般只会用到图片中①②③

    ①是显示raw data的,打开如图所示:

    一般是配合着②来使用,②视图选中某一个封包后①会跳转到具体的位置。

    ②是显示整个交互封包的流程的整个封包视图,打开如图所示:

    分别包括具体消息的解析视图,协议分层视图以及协议整个封包视图,可以选中某一个命令,最左侧就会出现对应的解析

    ③实现是整个交互流程流程图,打开如图所示:

    这些流程图可以dump出来,可以从协议来区分,也可以让整个流程图出来,至于其他应用菜单,可以去查看下user manual手册。

    3. Ellisys工具的使用

    那到了Ellisys了,是我最喜欢的工具了·,Ellisys的air log sniffer要二三十万吧·一般不是专业开发蓝牙的估计不会选择使用这个工具,但是即使我们不买这个设备,安装了Ellisys的工具也可以看btsnoop的·下面我就一步一步教你通过Ellisys来打开btsnoop.

    1)首先打开APP,这个没什么好说的,Ellisys不能直接把btsnoop拖进来打开

    2)选择File->Import,出现以下界面。

    3)选择HCI data.commands and events.点击next.会出现以下界面。

    4)然后选择BT snoop HCI,通过Browser来打开特定的文件。点击next

    5)到了这步就不用管了,直接Finsh就好了·打开效果如图所示

    其中下图是协议选择框

    把鼠标放上去就会有对应的是什么协议提示出来。比如上图我们选择的是All layers,就是所以协议都会显示。

    这个框就是协议交互每包数据的显示

    右边的框框就是特定选中数据包协议的解析

    另外,Ellisys还有到处audio,流程图等操作,这部分文档讲解起来比较麻烦,建议看我们视频教程吧!

    展开全文
  • 网络分析工具——WireShark的使用(超详细)

    万次阅读 多人点赞 2021-01-24 13:32:50
    网络分析工具——WireShark的使用简介WireShark软件安装Wireshark 开始抓包示例WireShark抓包界面WireShark 主要分为这几个界面TCP包的具体内容Wireshark过滤器设置wireshark过滤器表达式的规则Wireshark抓包分析TCP...

    简介

    WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程中各种问题定位。本文主要内容包括:
    1、Wireshark软件下载和安装以及Wireshark主界面介绍。

    2、WireShark简单抓包示例。通过该例子学会怎么抓包以及如何简单查看分析数据包内容。

    3、Wireshark过滤器使用。通过过滤器可以筛选出想要分析的内容。包括按照协议过滤、端口和主机名过滤、数据包内容过滤。

    WireShark软件安装

    软件下载路径:wireshark官网。按照系统版本选择下载,下载完成后,按照软件提示一路Next安装。

    如果你是Win10系统,安装完成后,选择抓包但是不显示网卡,下载win10pcap兼容性安装包。下载路径:win10pcap兼容性安装包

    Wireshark 开始抓包示例

    先介绍一个使用wireshark工具抓取ping命令操作的示例,让读者可以先上手操作感受一下抓包的具体过程。
    1、打开wireshark 2.6.5,主界面如下:
    在这里插入图片描述
    2、选择对应的网卡,右键,会出现Start Capture(开始捕获),点击即可进行捕获该网络信息,开始抓取网络包
    在这里插入图片描述3、执行需要抓包的操作,如ping www.baidu.com。
    4、操作完成后相关数据包就抓取到了。为避免其他无用的数据包影响分析,可以通过在过滤栏设置过滤条件进行数据包列表过滤,获取结果如下。
    说明:ip.addr == 180.101.49.11 and icmp 表示只显示ICPM协议且源主机IP或者目的主机IP为119.75.217.26的数据包。
    在这里插入图片描述在这里插入图片描述
    5、wireshark抓包完成,就这么简单。关于wireshark过滤条件和如何查看数据包中的详细内容在后面介绍。

    WireShark抓包界面

    在这里插入图片描述
    说明:数据包列表区中不同的协议使用了不同的颜色区分。协议颜色标识定位在菜单栏View --> Coloring Rules。如下所示
    在这里插入图片描述

    WireShark 主要分为这几个界面

    1、Display Filter(显示过滤器), 用于设置过滤条件进行数据包列表过滤。菜单路径:Analyze --> Display Filters。
    在这里插入图片描述2、Packet List Pane(数据包列表), 显示捕获到的数据包,每个数据包包含编号,时间截,源地址,目标地址,协议,长度,以及数据包信息。 不同协议的数据包使用了不同的颜色区分显示。
    在这里插入图片描述
    3、Packet Details Pane(数据包详细信息), 在数据包列表中选择指定数据包,在数据包详细信息中会显示数据包的所有详细信息内容。数据包详细信息面板是最重要的,用来查看协议中的每一个字段。各行信息分别为
    (1)Frame: 物理层的数据帧概况

    (2)Ethernet II: 数据链路层以太网帧头部信息

    (3)Internet Protocol Version 4: 互联网层IP包头部信息

    (4)Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP

    (5)Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
    在这里插入图片描述

    TCP包的具体内容

    从下图可以看到wireshark捕获到的TCP包中的每个字段。
    在这里插入图片描述
    4. Dissector Pane(数据包字节区)。

    Wireshark过滤器设置

    初学者使用wireshark时,将会得到大量的冗余数据包列表,以至于很难找到自己自己抓取的数据包部分。wireshar工具中自带了两种类型的过滤器,学会使用这两种过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。
    (1)抓包过滤器

    捕获过滤器的菜单栏路径为Capture --> Capture Filters。用于在抓取数据包前设置。
    在这里插入图片描述如何使用?可以在抓取数据包前设置如下。
    在这里插入图片描述
    ip host 60.207.246.216 and icmp表示只捕获主机IP为60.207.246.216的ICMP数据包。获取结果如下:
    在这里插入图片描述(2)显示过滤器
    显示过滤器是用于在抓取数据包后设置过滤条件进行过滤数据包。通常是在抓取数据包时设置条件相对宽泛,抓取的数据包内容较多时使用显示过滤器设置条件过滤以方便分析。同样上述场景,在捕获时未设置捕获规则直接通过网卡进行抓取所有数据包,如下
    在这里插入图片描述执行ping www.huawei.com获取的数据包列表如下
    在这里插入图片描述
    观察上述获取的数据包列表,含有大量的无效数据。这时可以通过设置显示器过滤条件进行提取分析信息。ip.addr == 211.162.2.183 and icmp。并进行过滤。
    在这里插入图片描述上述介绍了抓包过滤器和显示过滤器的基本使用方法。在组网不复杂或者流量不大情况下,使用显示器过滤器进行抓包后处理就可以满足我们使用。下面介绍一下两者间的语法以及它们的区别。

    wireshark过滤器表达式的规则

    1、抓包过滤器语法和实例

    抓包过滤器类型Type(host、net、port)、方向Dir(src、dst)、协议Proto(ether、ip、tcp、udp、http、icmp、ftp等)、逻辑运算符(&& 与、|| 或、!非)

    (1)协议过滤

    比较简单,直接在抓包过滤框中直接输入协议名即可。

    TCP,只显示TCP协议的数据包列表

    HTTP,只查看HTTP协议的数据包列表

    ICMP,只显示ICMP协议的数据包列表

    (2)IP过滤

    host 192.168.1.104

    src host 192.168.1.104

    dst host 192.168.1.104

    (3)端口过滤

    port 80

    src port 80

    dst port 80

    (4)逻辑运算符&& 与、|| 或、!非

    src host 192.168.1.104 && dst port 80 抓取主机地址为192.168.1.80、目的端口为80的数据包

    host 192.168.1.104 || host 192.168.1.102 抓取主机为192.168.1.104或者192.168.1.102的数据包

    !broadcast 不抓取广播数据包
    2、显示过滤器语法和实例

    (1)比较操作符

    比较操作符有== 等于、!= 不等于、> 大于、< 小于、>= 大于等于、<=小于等于。

    (2)协议过滤

    比较简单,直接在Filter框中直接输入协议名即可。注意:协议名称需要输入小写。

    tcp,只显示TCP协议的数据包列表

    http,只查看HTTP协议的数据包列表

    icmp,只显示ICMP协议的数据包列表
    在这里插入图片描述
    (3) ip过滤
    ip.src ==192.168.1.104 显示源地址为192.168.1.104的数据包列表

    ip.dst==192.168.1.104, 显示目标地址为192.168.1.104的数据包列表

    ip.addr == 192.168.1.104 显示源IP地址或目标IP地址为192.168.1.104的数据包列表

    在这里插入图片描述(4)端口过滤

    tcp.port ==80, 显示源主机或者目的主机端口为80的数据包列表。

    tcp.srcport == 80, 只显示TCP协议的源主机端口为80的数据包列表。

    tcp.dstport == 80,只显示TCP协议的目的主机端口为80的数据包列表。
    在这里插入图片描述(5) Http模式过滤

    http.request.method==“GET”, 只显示HTTP GET方法的。
    (6)逻辑运算符为 and/or/not

    过滤多个条件组合时,使用and/or。比如获取IP地址为192.168.1.104的ICMP数据包表达式为ip.addr == 192.168.1.104 and icmp
    在这里插入图片描述(7)按照数据包内容过滤。假设我要以IMCP层中的内容进行过滤,可以单击选中界面中的码流,在下方进行选中数据。如下
    在这里插入图片描述
    右键单击选中后出现如下界面(作为过滤器应用)
    在这里插入图片描述选中Select后在过滤器中显示如下
    在这里插入图片描述
    后面条件表达式就需要自己填写。如下我想过滤出data数据包中包含"abcd"内容的数据流。包含的关键词是contains 后面跟上内容。
    在这里插入图片描述看到这, 基本上对wireshak有了初步了解。

    Wireshark抓包分析TCP三次握手

    (1)TCP三次握手连接建立过程

    第一步:客户端发送一个SYN=1,ACK=0标志的数据包给服务端,请求进行连接,这是第一次握手;

    第二步:服务端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手;

    第三步:服务端发送一个SYN=0,ACK=1的数据包给客户端,告诉它连接已被确认,这就是第三次握手。TCP连接建立,开始通讯。
    在这里插入图片描述
    (2)wireshark抓包获取访问指定服务端数据包
    Step1:启动wireshark抓包,打开浏览器输入www.huawei.com。

    Step2:使用ping www.huawei.com获取IP。
    在这里插入图片描述
    Step3:输入过滤条件获取待分析数据包列表 ip.addr == 211.162.2.183

    在这里插入图片描述 图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。

    第一次握手数据包

    客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图。
    在这里插入图片描述数据包的关键属性如下:

    SYN :标志位,表示请求建立连接

    Seq = 0 :初始建立连接值为0,数据包的相对序列号从0开始,表示当前还没有发送数据

    Ack =0:初始建立连接值为0,已经收到包的数量,表示当前没有接收到数据
    第二次握手的数据包

    服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1,即0+1=1, 如下图
    在这里插入图片描述数据包的关键属性如下:

    Seq = 0 :初始建立值为0,表示当前还没有发送数据

    Ack = 1:表示当前端成功接收的数据位数,虽然客户端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位。(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)

    第三次握手的数据包

    客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:
    在这里插入图片描述
    数据包的关键属性如下:

    ACK :标志位,表示已经收到记录

    Seq = 1 :表示当前已经发送1个数据

    Ack = 1 : 表示当前端成功接收的数据位数,虽然服务端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)。

    就这样通过了TCP三次握手,建立了连接。开始进行数据交互
    在这里插入图片描述下面针对数据交互过程的数据包进行一些说明:
    在这里插入图片描述数据包的关键属性说明

    Seq: 1

    Ack: 1: 说明现在共收到1字节数据
    在这里插入图片描述Seq: 1
    Ack: 951: 说明现在服务端共收到951字节数据

    在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。如下
    在这里插入图片描述其中,对于我们日常的分析有用的就是前面的五个字段。它们的含义是:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有DATA数据传输,RST表示连接重置。

    Wireshark分析常用操作

    调整数据包列表中时间截显示格式。调整方法为View -->Time Display Format --> Date and Time of Day。调整后格式如下:
    在这里插入图片描述
    出处:https://www.cnblogs.com/linyfeng/p/9496126.html

    展开全文
  • 主成分分析(PCA)原理详解

    万次阅读 多人点赞 2018-06-09 15:08:25
    “微信公众号”本文同步更新在我的微信公众号里,地址:https://mp.weixin.qq.com/s/Xt1vLQfB20rTmtLjiLsmww本文同步更新在我的知乎专栏里面:主成分分析(PCA)原理详解 - Microstrong的文章 - 知乎...

    “微信公众号”

    1.相关背景

    在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律。多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的工作量。更重要的是在很多情形下,许多变量之间可能存在相关性,从而增加了问题分析的复杂性。如果分别对每个指标进行分析,分析往往是孤立的,不能完全利用数据中的信息,因此盲目减少指标会损失很多有用的信息,从而产生错误的结论。

    因此需要找到一种合理的方法,在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量之间存在一定的相关关系,因此可以考虑将关系紧密的变量变成尽可能少的新变量,使这些新变量是两两不相关的,那么就可以用较少的综合指标分别代表存在于各个变量中的各类信息。主成分分析与因子分析就属于这类降维算法。

    2. 数据降维

    降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。

    降维具有如下一些优点:

    • 1) 使得数据集更易使用。
    • 2) 降低算法的计算开销。
    • 3) 去除噪声。
    • 4) 使得结果容易理解。

    降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。

    3. PCA原理详解

    3.1 PCA的概念

    PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。

    思考:我们如何得到这些包含最大差异性的主成分方向呢?

    答案:事实上,通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。

    由于得到协方差矩阵的特征值特征向量有两种方法:特征值分解协方差矩阵、奇异值分解协方差矩阵,所以PCA算法有两种实现方法:基于特征值分解协方差矩阵实现PCA算法、基于SVD分解协方差矩阵实现PCA算法。

    既然提到协方差矩阵,那么就简单介绍一下方差和协方差的关系。然后概括介绍一下特征值分解矩阵原理、奇异值分解矩阵的原理。概括介绍是因为在我之前的《机器学习中SVD总结》文章中已经详细介绍了特征值分解原理和奇异值分解原理,这里就不再重复讲解了。可以看我的

    《机器学习中SVD总结》文章。地址:机器学习中SVD总结

    3.2 协方差和散度矩阵

    样本均值:

    样本方差:


    样本X和样本Y的协方差:

    由上面的公式,我们可以得到以下结论:

    (1) 方差的计算公式是针对一维特征,即针对同一特征不同样本的取值来进行计算得到;而协方差则必须要求至少满足二维特征;方差是协方差的特殊情况。

    (2) 方差和协方差的除数是n-1,这是为了得到方差和协方差的无偏估计。

    协方差为正时,说明X和Y是正相关关系;协方差为负时,说明X和Y是负相关关系;协方差为0时,说明X和Y是相互独立。Cov(X,X)就是X的方差。当样本是n维数据时,它们的协方差实际上是协方差矩阵(对称方阵)。例如,对于3维数据(x,y,z),计算它的协方差就是:

    散度矩阵定义为:

    对于数据X的散度矩阵为。其实协方差矩阵和散度矩阵关系密切,散度矩阵就是协方差矩阵乘以(总数据量-1)。因此它们的特征值和特征向量是一样的。这里值得注意的是,散度矩阵是SVD奇异值分解的一步,因此PCA和SVD是有很大联系。

    3.3 特征值分解矩阵原理

    (1) 特征值与特征向量

    如果一个向量v是矩阵A的特征向量,将一定可以表示成下面的形式:

    其中,λ是特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。

    (2) 特征值分解矩阵

    对于矩阵A,有一组特征向量v,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:


    其中,Q是矩阵A的特征向量组成的矩阵,\Sigma则是一个对角阵,对角线上的元素就是特征值。

    具体了解这一部分内容看我的《机器学习中SVD总结》文章。地址:机器学习中SVD总结

    3.4 SVD分解矩阵原理

    奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:

    假设A是一个m*n的矩阵,那么得到的U是一个m*m的方阵,U里面的正交向量被称为左奇异向量。Σ是一个m*n的矩阵,Σ除了对角线其它元素都为0,对角线上的元素称为奇异值。是v的转置矩阵,是一个n*n的矩阵,它里面的正交向量被称为右奇异值向量。而且一般来讲,我们会将Σ上的值按从大到小的顺序排列。

    SVD分解矩阵A的步骤:

    (1) 求的特征值和特征向量,用单位化的特征向量构成 U。

    (2) 求的特征值和特征向量,用单位化的特征向量构成 V。

    (3) 将或者的特征值求平方根,然后构成 Σ。

    具体了解这一部分内容看我的《机器学习中SVD总结》文章。地址:机器学习中SVD总结

    3.5 PCA算法两种实现方法

    (1) 基于特征值分解协方差矩阵实现PCA算法

    输入:数据集 ,需要降到k维。

    1) 去平均值(即去中心化),即每一位特征减去各自的平均值。、

    2) 计算协方差矩阵,注:这里除或不除样本数量n或n-1,其实对求出的特征向量没有影响。

    3) 用特征值分解方法求协方差矩阵的特征值与特征向量。

    4) 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为行向量组成特征向量矩阵P。

    5) 将数据转换到k个特征向量构建的新空间中,即Y=PX。

    总结:

    1)关于这一部分为什么用 ,这里面含有很复杂的线性代数理论推导,想了解具体细节的可以看下面这篇文章。

    CodingLabs - PCA的数学原理

    2)关于为什么用特征值分解矩阵,是因为 是方阵,能很轻松的求出特征值与特征向量。当然,用奇异值分解也可以,是求特征值与特征向量的另一种方法。

    举个例子:


    以X为例,我们用PCA方法将这两行数据降到一行。

    1)因为X矩阵的每行已经是零均值,所以不需要去平均值。

    2)求协方差矩阵:

    3)求协方差矩阵的特征值与特征向量。

    求解后的特征值为:

    对应的特征向量为:


    其中对应的特征向量分别是一个通解,可以取任意实数。那么标准化后的特征向量为:


    4)矩阵P为:


    5)最后我们用P的第一行乘以数据矩阵X,就得到了降维后的表示:


    结果如图1所示:


                                                                                        图1:数据矩阵X降维投影结果

    注意:如果我们通过特征值分解协方差矩阵,那么我们只能得到一个方向的PCA降维。这个方向就是对数据矩阵X从行(或列)方向上压缩降维。

    (2) 基于SVD分解协方差矩阵实现PCA算法

    输入:数据集,需要降到k维。

    1) 去平均值,即每一位特征减去各自的平均值。

    2) 计算协方差矩阵。

    3) 通过SVD计算协方差矩阵的特征值与特征向量。

    4) 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。

    5) 将数据转换到k个特征向量构建的新空间中。

    在PCA降维中,我们需要找到样本协方差矩阵的最大k个特征向量,然后用这最大的k个特征向量组成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵,当样本数多、样本特征数也多的时候,这个计算还是很大的。当我们用到SVD分解协方差矩阵的时候,SVD有两个好处:

    1) 有一些SVD的实现算法可以先不求出协方差矩阵也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解而是通过SVD来完成,这个方法在样本量很大的时候很有效。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是特征值分解。

    2)注意到PCA仅仅使用了我们SVD的左奇异矩阵,没有使用到右奇异值矩阵,那么右奇异值矩阵有什么用呢?

    假设我们的样本是m*n的矩阵X,如果我们通过SVD找到了矩阵最大的k个特征向量组成的k*n的矩阵 ,则我们可以做如下处理:


    可以得到一个m*k的矩阵X',这个矩阵和我们原来m*n的矩阵X相比,列数从n减到了k,可见对列数进行了压缩。也就是说,左奇异矩阵可以用于对行数的压缩;右奇异矩阵可以用于对列(即特征维度)的压缩。这就是我们用SVD分解协方差矩阵实现PCA可以得到两个方向的PCA降维(即行和列两个方向)。

    4. PCA实例

    (1)PCA的Python实现:

    ##Python实现PCA
    import numpy as np
    def pca(X,k):#k is the components you want
      #mean of each feature
      n_samples, n_features = X.shape
      mean=np.array([np.mean(X[:,i]) for i in range(n_features)])
      #normalization
      norm_X=X-mean
      #scatter matrix
      scatter_matrix=np.dot(np.transpose(norm_X),norm_X)
      #Calculate the eigenvectors and eigenvalues
      eig_val, eig_vec = np.linalg.eig(scatter_matrix)
      eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]
      # sort eig_vec based on eig_val from highest to lowest
      eig_pairs.sort(reverse=True)
      # select the top k eig_vec
      feature=np.array([ele[1] for ele in eig_pairs[:k]])
      #get new data
      data=np.dot(norm_X,np.transpose(feature))
      return data
    
    X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    
    print(pca(X,1))

    上面代码实现了对数据X进行特征的降维。结果如下:

    (2)用sklearn的PCA与我们的PCA做个比较:

    ##用sklearn的PCA
    from sklearn.decomposition import PCA
    import numpy as np
    X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    pca=PCA(n_components=1)pca.fit(X)
    print(pca.transform(X))

    结果如下:

    搞了半天结果不是很一样啊!分析一下吧!

    sklearn中的PCA是通过svd_flip函数实现的,sklearn对奇异值分解结果进行了一个处理,因为ui*σi*vi=(-ui)*σi*(-vi),也就是u和v同时取反得到的结果是一样的,而这会导致通过PCA降维得到不一样的结果(虽然都是正确的)。具体了解可以看参考文章9或者自己分析一下sklearn中关于PCA的源码。

    5. PCA的理论推导

    PCA有两种通俗易懂的解释:(1)最大方差理论;(2)最小化降维造成的损失。这两个思路都能推导出同样的结果。

    我在这里只介绍最大方差理论:

    在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。样本在u1上的投影方差较大,在u2上的投影方差较小,那么可认为u2上的投影是由噪声引起的。

    因此我们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。

    比如我们将下图中的5个点投影到某一维上,这里用一条过原点的直线表示(数据已经中心化):

    假设我们选择两条不同的直线做投影,那么左右两条中哪个好呢?根据我们之前的方差最大化理论,左边的好,因为投影后的样本点之间方差最大(也可以说是投影的绝对值之和最大)。

    计算投影的方法见下图:


    图中,红色点表示样例,蓝色点表示在u上的投影,u是直线的斜率也是直线的方向向量,而且是单位向量。蓝色点是在u上的投影点,离原点的距离是<x,u>(即或者)。

    6. 选择降维后的维度K(主成分的个数)

    如何选择主成分个数K呢?先来定义两个概念:


    选择不同的K值,然后用下面的式子不断计算,选取能够满足下列式子条件的最小K值即可。

    其中t值可以由自己定,比如t值取0.01,则代表了该PCA算法保留了99%的主要信息。当你觉得误差需要更小,你可以把t值设置的更小。上式还可以用SVD分解时产生的S矩阵来表示,如下面的式子:


    Reference:

    (1) 主成分分析(PCA)原理详解

    http://blog.csdn.net/zhongkelee/article/details/44064401

    (2) 机器学习之PCA主成分分析 - steed灬 - 博客园

    https://www.cnblogs.com/steed/p/7454329.html

    (3) 简单易学的机器学习算法——主成分分析(PCA)

    https://blog.csdn.net/google19890102/article/details/27969459

    (4) 机器学习实战之PCA - 笨鸟多学 - 博客园

    https://www.cnblogs.com/zy230530/p/7074215.html

    (5) 机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用 - LeftNotEasy - 博客园

    http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html

    (6) 从PCA和SVD的关系拾遗

    https://blog.csdn.net/Dark_Scope/article/details/53150883

    (7) CodingLabs - PCA的数学原理

    http://blog.codinglabs.org/articles/pca-tutorial.html

    (8) PCA(主成分分析)python实现

    https://www.jianshu.com/p/4528aaa6dc48

    (9) 主成分分析PCA(Principal Component Analysis)在sklearn中的应用及部分源码分析

    https://www.cnblogs.com/lochan/p/7001907.html

    展开全文
  • 4.2 内存使用分析 我们在开发过程中,经常会遇到内存泄漏的问题,为了定位内存泄漏的代码位置,这时我们就可以使用Visual Studio性能探测器下内存使用率工具来对对应项目模块的代码进行内存泄漏分析具体操作...
  • Wireshark使用技巧及数据包分析方法

    千次阅读 2019-05-05 11:35:51
    在进行网络分析时往往只需要知道两个节点是不是能够联通,具体的传输信息并不重要,所以抓包的时候可以设置只抓包头,这样就大大减少了数据包的大小,有利于数据分析。 设置方法:Capture(捕获)–>Options...
  • 使用wireshark抓包并进行网络协议分析

    万次阅读 多人点赞 2018-10-18 15:37:35
    这次实验并不是对所有的网络协议都进行分析,而是从下面这个问题出发(面试常被问)。从这一过程中复习学过的网络协议。使用的工具是wireshark。 问题:在浏览器中输入URL后,执行的过程。会用到哪些协议? 例如:...
  • 目录 领域驱动实践总结三:具体应用设计分析 一、应用项目的基本背景 二、针对项目进行领域驱动的战略设计阶段 (一)事件风暴确定产品愿景 (二)事件风暴进行业务场景分析 场景分析一:请假 用户:请假人 场景分析...
  • 需求分析具体写法

    万次阅读 多人点赞 2016-03-14 10:30:52
    当我们刚刚毕业的时候,还在使用VB、PB开发一些简单的数据库应用,而现在却几乎看不到它们的踪影,换来的是诸如J2EE和.NET这样的大型web应用。而这期间,RUP、XP、敏捷开发、持续集成••••••一个接一个的新概念...
  • 本文介绍了Android Studio CPU profiler性能分析工具的使用,以及如何使用Android Studio CPU profiler解决我们的APP耗时,卡顿等问题。
  • 三、实验内容及原理 (1) 安装 ethereal 软件 (2) 捕捉数据包,验证数据帧、IP 数据报、TCP 数据段的报文格式。 (3) 捕捉并分析 ARP 报文。 (4) 捕捉 ping 过程中的 ICMP 报文, 分析结果各参数的意义。 (5...
  • Wireshark抓包工具使用以及数据包分析

    万次阅读 多人点赞 2017-07-06 11:06:31
    多年之后,愿你有清风与烈酒,也有人是...点击某个包,可以查看具体内容,差不多刚好对于五层协议: Frame:物理层的数据帧概况。 Ethernet II:数据链路层以太网帧头部信息。 Internet Protocol Version 4:互联网层I
  • 技术可行性分析注意哪些内容

    千次阅读 2020-03-29 21:41:27
    技术可行性分析注意的内容:进行技术可行性分析时,要注意以下一些问题。 1、全面考虑系统开发过程所涉及的所有技术问题 软件开发涉及多方面的技术,包括开发方法、软硬件平台、网络结构、系统布局和结构、输入输出...
  • 使用clusterProfiler进行KEGG富集分析

    万次阅读 多人点赞 2018-11-05 10:14:32
    欢迎关注微信公众号《生信修炼手册》! KEGG pathway是最常用的功能注释数据库之一,可以利用KEGG 的API获取一个物种所有基因对应的...通过该链接可以获得以下内容 path:hsa00010 hsa:10327 path:hsa00010 hsa:124 pa...
  • LINGO结果窗口内容解读与灵敏度分析

    万次阅读 多人点赞 2018-11-15 19:56:19
    1.结果窗口内容解读 目标函数值:Global option solution found.表示求出了全局最优解;Objective value表示最优目标值,Total solver iretion表示求解时共用了几次迭代 决策变量:Value给出最优解中各...
  • 数值分析内容概览及学习总结

    万次阅读 多人点赞 2016-01-18 16:46:08
    关于数值分析这门课程,很多同学感觉学起来十分吃力,所以在此给出数值分析学习内容的概览(国内研究生基本一样)以及作者自己学习时的一些总结,希望对您的学习有所脾益,相互进步。 写在前面 数值分析的核心...
  • 2017 Python 问卷调查结果初步分析

    千次阅读 2018-04-29 14:48:02
    Note:本文在我的个人站点同步发布:2017 Python 问卷调查结果初步分析 · Lee’s Space Station,无广告,体验更好。 未经授权,禁止转载。 前言 2017 年末,PSF(Python Software Foundation,Python 软件...
  • 预备阅读:【进阶】使用Excel进行相关分析  前言  昨天学习了Excel中的相关分析,在数据分析中,相关分析和回归分析关系紧密,今天来学习下Excel中的回归分析。  回归分析  回归分析(regressionanalysis)是...
  • python文本数据分析案例—新闻分类

    万次阅读 多人点赞 2020-04-21 16:21:49
    1新闻分类 1.1案例背景 新闻分类是文本分类中常见的应用场量。在传统分类模式下,往往层通过人工对新闻内合进行核对,从而将新闻划分到合适的类别... 具体实现内容包括: ◆能够对文本数据进行预处理。【文本清洗, ...
  • 基于Python的数据分析

    万次阅读 多人点赞 2019-02-25 15:50:02
    下面来介绍一下基于Python的数据分析,主要介绍数据分析的概念、数据分析流程、Python优势、常用模块的用途以及使用 Python进行数据分析的学习方法及步骤; 随着大数据和人工智能时代的到来,网络和信息技术开始...
  • 方差分析实用分析步骤总结

    千次阅读 2019-07-24 13:16:58
    以上这些分析两个及两个数据之间的差异情况都可以使用同一种分析方法——方差分析。 01. 概念 方差分析用于定类数据(X)与定量数据(Y)之间的差异分析,例如研究三组学生(X)的智商平均值(Y)是否有显著差异...
  • python抓取并分析日志样本

    万次阅读 2019-02-23 11:07:52
    最近需要帮我哥做个python小功能,功能的目的就是分析现有的一堆access日志文件(不包含实时增量分析,仅针对固定样本日志,约400mb),从中查找出包含某一关键字的日志,并提取ip出来,统计同一ip出现的次数。...
  • 病毒分析工具和使用方法(一)

    万次阅读 多人点赞 2018-11-13 17:29:58
    具体分析的时候ollydbg一般是结合ida pro来使用的,ollydbg有很多快捷键,整理如下表: 快捷键 功能 F2 设置断点 F8 单步步过 ...
  • Android最佳性能实践(二)——分析内存的使用情况

    万次阅读 多人点赞 2015-02-12 09:09:52
    所以,唯一能够解决问题的办法,就是尝试去分析应用程序的内存使用情况,那么本篇文章就会教大家如何进行分析。虽说现在的手机内存都已经非常大了,但是我们大家都知道,系统是不可能将所有的内存都分配给我们的应用...
  • ArcGIS水文分析实战教程(1)GIS与水文学

    万次阅读 多人点赞 2017-06-17 20:29:29
    GIS与水文分析(1)GIS与水文学 对于大部分GIS从业人员或者利用GIS作为研究方向的人员来说,水文学过于专业,更偏重于理论化,很难从GIS的角度来模拟和分析水文的过程。这其实是个普遍性的问题,任何跨专业跨学科去...
  • Python 爬虫和数据分析实战

    万次阅读 多人点赞 2018-04-12 10:41:43
    课程介绍 本课程是 Python 爬虫和数据分析项目实战课程,主要分 3 部分: 第 1 部分是 Python 爬虫,主要使用 Urllib 3 和 BeautifulSoup 抓取天猫商城和京东...第 3 半部分利用 Pandas 对数据进行分析,以及使用 M...
  • 结合实际案例讲解系统分析方法

    万次阅读 2019-04-11 23:30:16
    从产品做出原型到研发编程实现,中间有一条鸿沟。...内容包括: 软件系统分析全过程 定义系统的目标和范围 分析系统流程 需求规格描述 系统分析能力是架构师必备的,希望通过本次交流,为学员成为系统架构...
  • 使用Python进行数据关联分析

    万次阅读 多人点赞 2018-03-01 14:43:21
    关联分析 选择函数包 ...关联分析属于数据挖掘的一大类。...经过分析,我决定使用Oranges进行关联规则的实现,原因如下: FP-growth算法比Apriori算法时间复杂度低 Orange3是一整套数据挖掘工具...
  • 数据挖掘与数据分析

    万次阅读 多人点赞 2018-05-28 13:58:14
    一、数据挖掘和数据分析概述 数据挖掘和数据分析都是从数据中提取一些有价值的信息,二者有很多联系,但是二者的侧重点和实现手法有所区分。 数据挖掘和数据分析的不同之处: 1、在应用工具上,数据挖掘一般要通过...
  • 1. 前言 生产环境中,尤其是吃大内存的JVM,一旦出现内存泄露等问题是非常容易引发OutofMemory的,如果没有一个好的工具提供给开发人员定位问题和分析问题,那么这将会是一场噩梦。目前JDK其实自带有一些内存泄露...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 935,710
精华内容 374,284
关键字:

具体怎么使用内容分析