精华内容
下载资源
问答
  • 这篇文章,是从我的《高效开发人员的五特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。 1. 要看书。在成千上万的编程图书中,可能很一部分根本毫无用处。但是...
    这篇文章,是从我的《高效开发人员的五个特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。 

    1. 要看书。在成千上万的编程图书中,可能很大一部分根本毫无用处。但是仍然有很多图书对你的(编程)能力有很大的提升。我一直坚持,相比在网络上查找很多有用信息,在同类图书中查找要来得更容易更快捷。阅读技术图书可心更好地抓住核心内容。对于理论,架构和设计等方面来说,图书也一样很有帮助。只不过要找到高质量的、权威的信息,就不如网络上可供查找的范围广。

    2. 读代码。这也是我很喜欢的一种方式。如果我并没有几年的专业编程工作经验,在学习之初我并不会去读很多复杂的代码。如果我要是早些开始学习,我将是一个比现在更好的程序员。但是,开始时我会从一些开源项目里,去学习那些源代码(当然,这些代码不能与我的工作有关,也不是我自己写的)。要从自己会使用到的,或者自己感兴趣的程序开始这项工作。我是从 Paint.net 这个网站里开始学习的,而且已经积累了很多关于 .NET 的编程技术。

    读别人的代码可以为你提供更多不同的工作思路,这比你完全凭自己思考得到的工作方式要多。

    3. 写代码。谨记,要写大量的代码。从根本上来讲,最好的学习方法就是实践。如果不写代码,你根本不能把(某种语言中)内在的东西学习透彻。学习之初,可以从一些技术指南和图书中照搬一些尽量简单的程序。当然,这种照搬是要自己完全手工输入,而不是复制和粘贴,这两种之间的效果差别是很大的。这种方法的主旨就在于,使知识内在化,并思考其用法,而不是盲目照抄。学习过程中,要时常查找新的 API 调用方法,这其实是简单的事情。

    最重要的是,要写一个你自己的程序,不管它是一个简单的游戏,或者是一个参与开源项目的程序,还是一个公为你自己使用的简单插件。用不同的方式来写程序,尽量尝试使用新的技术,新的技巧,新的设计方式。一定要让现在的项目比以往的项目更好。想要成一个优秀的开发者,这一点是核心。

    4. 与其他开发者交流。像 Apple,微软,Google 等大公司一样的新闻描述的一样,(与其他开发者交流)可以让你解决一些复杂的问题。虽然这并不能让你感觉到自己已经成一个团队或是社区的成员,但是这种方法可以让你接触到更多不同的想法。

    不同类型的项目要求不同的设计方法,代码技术,开发流程和设计思想。如果你工作在一个小团队里,你不必与太多的人接触,只要在用户群会议中找到一些人(来讨论)即可。如果这样还不行的话,参与到在线论坛中与其他人讨论(这时你需要更努力地寻找高质量的讨论内容)。

    6. 教会别人。相对于仅仅读代码之类的工作,教其他人学习可以让你更深入地学习某个技术,这种方法有着非凡的效果。教会别人某个技术,同样也会让你更专注于这种技术,并且可以比别人更深层次地理解它。同样你也会面对一些问题。

    “如果你不能向一个六岁的儿童解析清楚一个概念,那么其实是你并没有完全理解它。”Albert Einstein说。

    教学场景可以是无穷无尽的:与工作搭档一对一交流,休息碰面,非正式周会,学习茶会,教室,讨论发表会,等等。每周在相同理念开发者之间举办一次30分钟的非正式会议怎么样?每周,让几个人来就他们想要更深入了解话题,向大家传授这些技术知识,并且展开讨论。如果你知道你将要向团队成员们传授正学学习的知识,你是不是更想要了解这项技术的每个细节呢?

    6. 收听网络电台。如果你有空闲的时间,可以订阅网络电台节目。我现在最喜欢的编程节目就是 .Net Rocks。这个节目还会做一些视频节目,叫做 dnrTV 。这样会让你即时捕捉到最新最好的技术。一个人是不能学习到所有知识的,而网络电台刚是一个学习了解广泛知识的途径。

    7. 阅读博客。博客远远比阅读者要多,但是其中有一些却是极其优秀的。我这里不并不是要推荐博客,因为网络上已经有了足够多的博客。这是与真正在开发你所喜欢和使用的软件的开者联系的好方法。

    8. 学习新的语言。即使你已经在 C(++,#) / JAVA 等语言上有很好的造诣,仍然有很多其他可以解决问题的编程语言。学习新的语言,是对你已有思维方式的挑战。这不仅仅是另一种语言,更是对思维的重新架构。的确,所有的语言最后都会被编译成汇编程序,但是这并不意味着高级语言毫无价值。

    9. 学习不正确的方式。除了要学习应该怎么做,还要学习不应该怎么做。经常阅读 Dailywtf.com ,学习你并不知道的经验与教训。学习适当的面向对象设计方式,代码写作方式,和必须要写的代码等,是很好的方式,但是如果不细心的话也容易养成不良习惯。学习认识不正确的思路是负责项目开发至关重要的一环。

    维基百科对很多觉的不正确方式有十分透彻的分类。

    10. 要谦虚。

    学习,意味着:

    用更好的知识代替不完美的知识
    增长你所不知道的知识
    只有承认自己有所不足,才能有学习的动力。归根到底,就是谦虚,不对吗?如果你开始认为你已经掌握了所有需要的知识,那么你就危险了。真正的学习是如饥似渴地追逐知识并使其内在化,这需要很大的努力。我们都知道这一点,但是要必须时常不断地提醒自己。
    展开全文
  • 特征工程做事情是从数据中抽取出来,对结果预测有用的信息特征工程是使用专业背景知识和机器学习技巧处理数据,使得特征能在机器学习算法上发挥更大的作用。 要提升机器学习效果可以有三个途径: 1 选择一...

    本系列是七月算法机器学习课程笔记

    1 特征工程与意义

    特征工程做的事情是从数据中抽取出来的,对结果预测有用的信息。
    特征工程是使用专业背景知识和机器学习技巧处理数据,使得特征能在机器学习算法上发挥更大的作用。

    要提升机器学习的效果可以有三个途径:
    1 选择一个合适的模型,模型越简单越好
    2 编码技能和机器学习技能,能够通过调参提升效果。这个提升效果大概在千分之几的级别。
    3 了解业务,通过抽取特征提升效果。这个提供效果大概在百分之几的级别。

    2 数据与特征处理

    2.1数据采集

    在数据采集阶段需要考虑哪些数据对最后的结果有帮助
    这些数据能不能采集到
    在预测阶段一般是实时在线的,这个时候采集这些数据是否能实时获取,不能实时获取或者代价很大的数据,不能使用

    例如:现在设计一个算法,预测同学学习课程的兴趣程度。可以考虑采集哪些数据呢?
    同学们学习课程的兴趣程度,可能跟老师、课程、同学相关。
    与老师相关的指标可能有:性别、声音、学历。
    与课程相关的指标可能有:课程内容、难易程度、是否与工作相关。
    与同学相关的指标可能有:有无数学基础、学历、目前就职状态、找工作计划。

    设计好特征之后就可以采集数据了。

    2.2 数据清洗

    采集后的数据需要清洗,否则就是garbage in , garbage out,(喂了垃圾数据,出来的模型也是垃圾的)

    数据清洗可以从以下角度考虑。

    1 单维度可信程度
    例如一个人身高3米,一个实验室每个月买墩布10万元…
    在数据清洗过程中可以根据情况去掉前百分之一和大于99%的那部分数据。

    2 组合或统计属性判定
    用常识解决异常值。例如在判断用户是否会买篮球的模型中,数据中有85%的女性样本。就不符合常识。

    3 补齐缺省值

    2.3 数据采样

    在遇到正负样本数量悬殊的情况下应该怎么处理?
    1 如果正负样>>负样本,且量都很大,可以使用下采样的方式解决。以负样本的数量为准,通过随机抽样的方式从正样本采集几乎同样数量的样本。还可以从正样本中通过分层抽样的方式重新采集样本。

    这里补充一下下采样的时间。先对原始数据集做训练集和测试集的拆分。之后对训练集中的样本多的分类做下采样。这是看见老师讲的案例中是这样的。原因不清楚。我想大概是这样可以在评估模型的时候因为测试集中的正样本更具代表性,模型准确度也会更可靠吧。

    假如一个数据集中正样本 800,负样本 100。
    先分数据集训练集、测试集,测试集占比20%。 测试中 正样本 160,负样本
    20;训练集中 正样本640,负样本80。再下采样,正样本80,负样本80。
    用此训练出的模型,在评估模型的时候这样本是160个,相对来说更客观一点。
    先下采样 正样本100,负样本100
    再分训练集、测试集,20% 测试集中 正样本 20,负样本20,训练集中 正样本80,负样本80。
    这里测试集中正样本数量只有20。相比前一个方法,缺失一点客观性。
    大概是这样吧。

    例如我前段时间做网页是否是列表页的判断。是列表页的数据量<不是列表页的数量。那我就从不是列表页的数量的样本中按照站点分组。例如我需要300个样本,有5个站点,就每个站点随机抽取60个样本组成新的不是列表页的样本集。

    2 如果正样本>>负样本,且量都不大,可以使用过采样的方式解决。对负样本的数据重复多份,或者样本是图片的话可以通过旋转,缩放等方式产生新的样本数据。

    在一些场景下还可以使用SMOTE算法造出一些数据。

    2.4 特征处理

    特征值的类型有:数值型、类别型、时间类、文本型、统计型、组合特征。下面分别描述各类特征的处理方式。

    2.4.1 数值型

    1 数值型特征幅度调整
    在一个模型中房间数量的值在[2,10]之间,房屋面积的值在[70,500]之间。这种幅度不同的特征值,幅度大的特征会对模型有更大的影响。所以模型效果不会很好。需要调整到同一幅度内。

    我们可以将特征值调整在[0,1]范围内:MinMaxScaler。计算方式:d=dminmaxmind=\dfrac{d-min}{max-min}

    我们也可以对特征值对标准化处理:StandScaler。计算方式:d=dmeand=\dfrac{d-mean}{标准差}

    2 可以通过log等函数,让特征值的数据域发生变化

    3 计算特征值的统计值

    统计值包含:max、min、mean、std。这可以通过pandas的describe方法获得。

    4 离散化
    首先说明为什么要做离散化。现在要用逻辑回归做一个地铁上是否让座的模型。其中一个特征值是年龄。
    逻辑回归的方程是p=11+ewxp=\dfrac{1}{1+e^{-wx}}
    一般情况下当遇到小宝宝或者老人会让座。上面的函数中,假设w为正,x越大,p越大。这样的话,就不能覆盖年龄小的情况。假设w为负,x越小,p越大,这样的话,就不能覆盖年龄大的情况。
    这个时候,我们就需要对年龄做离散化。这是因为我们没有对特征做进一步的细分。我们可以分为[0,6],[6-60],[60]三个特征。三个特征,三个权重,可以各自调整不受制约。

    再补充一个离散化的例子。例如在共享单车模型中,有一个特征是一星期的第几天。通过观察我们发现周一到周五会有两个使用高峰期,周六周日是一个使用高峰期。为了将这个特点描述出来,我们就需要对这个特征做离散化,分为两类:工作日和周末。

    接着说明怎么做离散化,分割的标准点在哪里。
    一种方法是等距切分。例如要分10分,最大值和最小值差距是100,那就每隔10,做一次分割。pandas函数是qcut。这种情况对于分布均匀的特征值比较适合。
    一种方法是将样本平均分配到不同的桶中。pandas函数是cut。

    5 柱状分布
    统计不同value的值的个数。例如样本中的年龄特征:0岁的10个,5岁的10个,20的30个,24岁的1个…

    2.4.2 类别型

    类别型的特征,例如衣服的颜色有红、黄、蓝、绿。这就是一个类别型的特征。还有每个星期的第几天也是类别型。

    1 one-hot编码
    对于衣服的颜色有红、黄、蓝、绿,我们用什么表示呢?可以使用1、2、3、4分别表示四种颜色。但是这样的话,当w为正的时候,绿色比红色对结果的影响大。当w为负的时候,红色笔绿色对结果的影响大。这是没有道理的。这四种颜色应该是平等的。

    在工程中使用one-hot编码,也称哑变量。我们在原来的数据集后面增加4列:是否红色、是否黄色、是否蓝色、是否绿色。对于一条数据只可能在其中一列值为1,其他列值为0。

    2 hash技巧
    例如在每一篇新闻中会出现很多词。整个数据集中会有很多词。每一遍文章中出现的词置为1。
    在这里插入图片描述

    这样处理的问题是矩阵是稀疏的,维度很高。可以使用hash桶的技巧。在数据集对每篇新闻做了分类,我们可以得到每个分类的词汇集合。例如可以知道财经类新闻、体育类新闻、娱乐类新闻的词汇集。一篇文章中出现的词属于哪个桶就在这个桶的value值+1。

    例如doc1,在财经类新闻集中出现了3个词汇,体育类中出现了2个词汇。

    3 histogram映射
    在这里插入图片描述

    例如数据集中的爱好有:足球、散步、看电视剧。这个爱好在性别中的分布是怎样的呢?
    男:[1/3,2/3,0] 女:[0,1/3,2/3]
    这个爱好在年龄中的分布是怎样的呢?
    21:[1,0,0] 22:[0,0,1]…

    得到这些数据之后怎么用呢?例如爱好在性别中的分布,得到之后,在原数据集后, 增加6列:足球男性分布、散步男性分布、看电视剧男性分布、足球女性分布、散步女性分布、看电视剧女性分布。每一条数据的这6个值都等于:1/3,2/3,0,0,1/3,2/3。这样的特征可能对于模型有作用,但不一定。

    2.4.3 时间型

    时间型特征可以看做连续值,也可以看做是离散值。
    如果计算的是持续时间(单页面浏览时长)、间隔时长(上次购买/点击离现在的时长)的时候是连续值。

    离散值对应的特征:


    一年中第几个星期
    一年中第几个季度
    一月中第几个星期
    一天中的哪个时段
    一周的第几天
    工作日/周末
    距离节假日的天数

    2.4.3 文本型

    1 词袋模型
    CounterVectorizer()
    得到一个稀疏向量

    2 n-gram
    解决 李雷喜欢韩梅梅 韩梅梅喜欢李雷 这种词的位置关系问题
    CounterVectorizer(ngram_range=(1,2),token_pattern=’\b\w+\b’,min_df=1)

    3 tf-idf
    TF(t)=ttTF(t)=\dfrac{词t在当前文本中的出现次数}{词t在总数据集中的出现次数}

    IDF(t)=ln(t)IDF(t)=ln(\dfrac{总文档数}{含t的文档数})

    TFIDF=TD(t)IDF(t)TF-IDF=TD(t)*IDF(t)

    3 word2vec
    得到一个稠密向量

    2.4.4 统计特征

    例如在判断用户是否会购买的模型中:
    1 购物车转换率=>用户维度的统计特征
    2 对不同商品点击/收藏/购买的总计=>商品维度的特征
    3 删除掉30天内从来不买东西的人=>按规则清洗

    统计特征主要包含有:
    1 加减平均:例如商品高于平均价多少,用户连续登陆天数超过平均值多少…
    2 分位线:商品价格位于售出商品价格的多少分位线
    3 次序性:排在第几位
    4 比例类:电商中,好中差评的比例

    组合特征
    组合特征是把任意两个特征拼接在一起。只有这一条数据中两个特征都为1,这个值才为1,否则为0。

    例如随意组合两个特征:用户id_category: 1001_女裙,1001_男士牛仔裤,1002_男士牛仔裤??

    也可以通过决策树学出一棵树模型,按照树模型中的全部或者部分路径做组合。

    例如组合特征是:男士_上海,男士_北京,女士_上海…

    3 特征选择

    3.1 为什么做特征选择

    因为有些特征是冗余的,有几个特征之间相关度很高,消耗计算资源。
    有些特征是噪声,对结果没有影响或者产生不好的影响。

    特征选择不同于降维:特征选择是踢掉原本特征中和结果预测关系不大的,而降维是做特征的计算组合构成新的特征。
    降维确实也能解决一定的高纬度的问题。

    3.2 特征选择的方法

    3.2.1 过滤型

    评估单个特征和结果之间的相关度,留下Top 相关的特征部分。
    可以使用pearson相关系数、互信息等测量相关度。
    缺点:是没有考虑到特征之间的关联作用,可能把有用的关联特征过滤掉。
    相关python包:SelectKBest

    3.2.2 包裹型

    典型的包裹型算法是递归特征删除算法(recursive feature elimination algorithm)

    具体做法是:
    1 用全量特征跑一个模型
    2 根据线性模型的系数,删掉5-10%的特征,再跑一次,观测准确率的变化。
    3 如果准确率没有明显变化,重复2。如果有大的下滑就停止。

    相关python包:sklearn.feature_selection.RFE
    这用在稠密矩阵中效果比较好。

    3.2.3 嵌入型

    最常见的方式是用正则化来做特征选择。
    在LR模型中,L1正则化能够起到截断作用。在3-5亿维度的模型中,用L1正则化最后可以剩下2-3千万的维度。意味着其他维度都不重要。
    这在LR和线性SVM中都起作用。
    在这稀疏矩阵中效果比较好。

    第二种和第三种方法用的比较多。

    展开全文
  • 我们前面讨论了基于频率的滤波和特征缩放修剪无信息的特征。现在我们来仔细讨论一下使用主成分分析(PCA)进行数据降维。 本章标志着进入基于模型的特征工程技术。在这之前,大多数技术可以在不参考数据的情况下定义...

    通过自动数据收集和特征生成技术,可以快速获得大量特征,但并非所有这些都有用。我们前面讨论了基于频率的滤波和特征缩放修剪无信息的特征。现在我们来仔细讨论一下使用主成分分析(PCA)进行数据降维。

    本章标志着进入基于模型的特征工程技术。在这之前,大多数技术可以在不参考数据的情况下定义。对于实例中,基于频率的过滤可能会说“删除所有小于n的计数“,这个程序可以在没有进一步输入的情况下进行数据本身。 另一方面,基于模型的技术则需要来自数据的信息。例如,PCA 是围绕数据的主轴定义的。 在之前的技术中,数据,功能和模型之间从来没有明确的界限。从这一点前进,差异变得越来越模糊。这正是目前关于特征学习研究的兴奋之处。

    降维是关于摆脱“无信息的信息”的同时保留关键点。有很多方法可以定义“无信息”。PCA 侧重于线性依赖的概念。在“矩阵的剖析”中,我们将数据矩阵的列空间描述为所有特征向量的跨度。如果列空间与特征的总数相比较小,则大多数特征是几个关键特征的线性组合。如果在下一步管道是一个线性模型,然后线性相关的特征会浪费空间和计算能力。为了避免这种情况,主成分分析尝试去通过将数据压缩成更低维的线性来减少这种“绒毛”子空间。

    在特征空间中绘制一组数据点。每个数据点都是一个点,整个数据点集合形成一个 blob。在图 6-1(a) 中,数据点在两个特征维度上均匀分布,blob 填充空间。在这个示例中,列空间具有完整的等级。但是,如果其中一些特征是其他特征的线性组合,那么该 blob 看起来不会那么丰满; 它看起来更像图 6-1(b),这是一个平面斑点,其中特征 1 是特征 2 的重复(或标量倍数)。在这种情况下,我们说该 blob 的本征维数是 1,即使它位于二维空间之中。

    在实践中,事情很少完全相同。这更可能是我们看到非常接近平等但不完全相同的特征。在这种情况下,数据 blob 可能如图 6-1(c) 所示。这是一个憔悴的一团。要是我们想要减少传递给模型的特征的数量,那么我们可以用一个新特征替换特征 1 和特征 2,可能称之为位于两个特征之间的对线的 1.5 特征。原始数据集可以是用一个数字充分表示——沿着特征方 1.5 的方向——而不是两个维度f1和f2。
    image
    图 6-1 特征空间中的数据 blobs(a) 满秩数据 blob(b) 低维数据 blob(c) 近似低维的数据 blob

    这里的关键思想是用一些充分总结原始特征空间中包含的信息的新特征取代冗余特征。当只有两个特征的时候新特征很容易得到。这在当原始特征空间具有数百或数千个维度时将变得很难。我们需要一种数学描述我们正在寻找的新功能的方法。这样我们就可以使用优化技术来找到它们。

    数学上定义“充分总结信息”的一种方法要求就是这样说新数据 blob 应该保留尽可能多的原来的列。我们是将数据块压扁成平坦的数据饼,但我们希望数据饼尽可能在正确的方向上。这意味着我们需要一种衡量特征列的方法。特征列与距离有关。但是在一些数据点中距离的概念有些模糊。可以测量任意两对之间的最大距离点。但事实证明,这是一个非常困难的数学优化功能。另一种方法是测量任意一对点之间的平均距离,或者等价地,每个点与它们的平均值之间的平均距离,即方差。事实证明,这优化起来要容易得多。(生活很难,统计学家已经学会了采取简便方法)在数学上,这体现为最大化新特征空间中数据点的方差。

    导航线性代数公式的提示
    为了保持面向线性代数的世界,保持跟踪哪些数量标量,它们是向量,向量的方向是垂直还是水平。知道你的矩阵的维度,因为他们经常告诉你感兴趣的向量是否在行或列中。绘制矩阵和向量作为页面上的矩形,并确保形状匹配。就像通过记录测量单位(距离以英里,速度以英里/小时计)一样,在代数中可以得到很大的代数,在线性代数中,所有人都需要的是尺寸。

    求导,
    提示和符号

    image
    image
    image
    图 6-2 PCA 的插图
    image
    image
    image
    image
    PCA 执行
    让我们更好地了解 PCA 如何将其应用于某些图像数据。MNIST 数据集包含从 0 到 9 的手写数字的图像。原始图像是28 x 28像素。使用 scikit-learn 分发图像的较低分辨率子集,其中每个图像被下采样为8×8像素。原始数据在 scikit 学习有 64 个维度。我们应用 PCA 并使用第一个可视化数据集三个主要部分。

    示例 6-1 scikit-learn 数字数据集(MNIST 数据集的一个子集)的主成分分析。
    image
    图 6-3 PCA 预测 MNIST 数据的子集。标记对应于图像标签。

    由于数字之间有相当多的重叠,因此很难清楚的将它们在投影空间中使用线性分类器分开。因此,如果任务是分类手写数字并且选择的模型是一个线性分类器,前三个主成分不足以作为功能。尽管如此有趣的是只有 3 个可以捕获多少个 64 维数据集尺寸。

    白化和 ZCA
    由于目标函数中的正交性约束,PCA 变换产生了很好的附带作用:转换后的特征不再相关。再换句话说,特征向量对之间的内积是零。这很容易使用奇异向量的正交性来证明这一点:结果是包含奇异值的平方的对角矩阵表示每个特征向量与其自身的相关性,也称为其 L2 规范。

    有时候,将特征的比例标准化为1.在信号中是有用的处理方式,这就是所谓的白化。 它产生了一组与自身具有单位相关性,并且彼此之间的相关性为零的结果。在数学上,白化可以通过将 PCA 变换乘以反奇异值。

    公式 6-24 PCA 白化
    image
    image

    最后,最好不要将 PCA 应用于原始计数(字数,音乐播放次数,电影观看次数等)。这是因为这种计数通常包含在内大的异常值。(这个概率非常高,有粉丝观看了 314,582 次“指环王”,这让其余的人望而生畏计数)。正如我们所知,PCA 在特征中查找线性相关性。相关性和方差统计对大的异常值非常敏感; 单一大量的数据可能会改变很多。

    用例
    PCA 通过查找线性相关模式来减少特征空间维度功能之间。由于涉及 SVD,PCA 计算数千个功能的代价很高。但是对于少量的实值特征而言,它非常重要值得尝试。

    PCA 转换会丢弃数据中的信息。因此,下游模型可能会训练成本更低,但可能不太准确。在 MNIST 数据集上,有一些观察到使用来自 PCA 的降维数据导致不太准确分类模型。在这些情况下,使用 PCA 有好处和坏处。

    PCA 最酷的应用之一是时间序列的异常检测。Lakhina,Crovella 和 Diot [2004] 使用 PCA 来检测和诊断异常互联网流量。他们专注于数量异常情况,即当出现波动或波动时减少从一个网络区域到另一个网络区域的通信量。这些突然更改可能表示配置错误的网络或协调的拒绝服务攻击。无论哪种方式,知道何时何地发生这种变化对互联网都是有价值的运营商。

    由于互联网上的交通总量非常之多,孤立的激增规模很小地区很难被发现。一个相对较小的主干链路处理很多交通。 他们的重要见解是,数量异常会影响到多个链接同时(因为网络数据包需要跳过多个节点才能到达他们的网络目的地)。将每个链接视为一项功能,并将每个链接的流量数量对待时间步骤作为测量。数据点是流量测量的时间片跨越网络上的所有链接。这个矩阵的主成分表明了网络上的整体流量趋势。其余的成分代表了剩余信号,其中包含异常。

    PCA 也经常用于金融建模。在这些用例中,它作为一种类型工作因子分析,一组旨在描述观察结果的统计方法使用少量未观察因素的数据变异性。在因素分析中应用程序,目标是找到解释性成分,而不是转换数据。

    像股票收益这样的财务数量往往是相互关联的。股票可以同时上下移动(正相关),也可以相反移动方向(负相关)。为了平衡波动和降低风险,投资组合需要多种不相关的股票其他。(如果篮子要下沉,不要把所有的鸡蛋放在一个篮子里)寻找强大的相关模式有助于决定投资策略。

    股票关联模式可能在行业范围内。 例如,科技股可能会上涨并一起下跌,而当油价高企时,航空股往往下跌。 但行业可能不是解释结果的最好方式。 分析师也在寻找观察到的统计数据中意外的相关性 特别是文体因素模型 [Connor,1995] 在个体股票时间序列矩阵上运行 PCA 返回寻找共同变化的股票。 在这个用例中,最终目标是主成分本身,而不是转换后的数据。

    从图像中学习时,ZCA 可作为预处理步骤。在自然的图像中,相邻像素通常具有相似的颜色。ZCA 白化可以消除这种相关性,这允许后续的建模工作集中在更有趣的图像上结构。Alex Krizhevsky 的“学习多层特征”的论文图像“包含很好的示例,说明 ZCA 影响自然图片。

    许多深度学习模型使用 PCA 或 ZCA 作为预处理步骤,但事实并非如此总是显示是必要的。在“Factored 3-Way Restricted Boltzmann Machines forModeling Natural Images”中,Ranzato et al,评论,“白化不是必要的,但加快了算法的收敛速度。在“An Analysis of Single-Layer Networks in Unsupervised Feature Learning”中,Coates 等人 发现 ZCA 白化是有帮助的对于某些号,但不是全部。(请注意,本文中的模型是无监督功能学习模型。 所以 ZCA 被用作其他功能的特征方法工程方法。方法的堆叠和链接在机器中很常见学习管道。)

    总结
    这结束了对 PCA 的讨论。关于 PCA 需要记住的两件事是其机制(线性投影)和目标(最大化方差预计数据)。该解决方案涉及协方差的特征分解矩阵,它与数据矩阵的 SVD 密切相关。人们还可以记住 PCA 的精神图像将数据挤压成像蓬松一样的煎饼可能。PCA 是模型驱动特征工程的一个示例。(应该立即怀疑当一个目标函数进入时,一个模型潜伏在背景中场景)。这里的建模假设是方差充分代表了包含在数据中的信息。等价地,该模型寻找线性特征之间的相关性。这在几个应用程序中用于减少相关性或在输入中找到共同因素。PCA 是一种众所周知的降维方法。但它有其局限性作为高计算成本和无法解释的结果。它作为一个预先定义好处理步骤,特别是在特征之间存在线性相关时。当被看作是一种消除线性相关的方法时,PCA 与其相关白化的概念。其表兄 ZCA 以可解释的方式使数据变白,但是不会降低维度。

    原文发布时间为:2018-12-20
    本文作者:机器学习AI算法工程
    本文来自云栖社区合作伙伴“ 机器学习AI算法工程”,了解相关信息可以关注“datayx”微信公众号

    展开全文
  • OpenCV学习笔记()

    2020-10-08 16:52:08
    平滑化和滤波操作:图像部分集中在幅度谱低频和中频段,在较高频段,有用信息经常被噪声淹没 滤波操作目的:1.特征模式识别2.消除噪声 平滑滤波:一类为模糊,另一类为消除噪音 种平滑滤波滤波器函数...

    平滑处理(模糊处理):一种简单且使用频率很高的图像处理方法,常用于减少图像上的噪点或失真

    图像滤波:图像预处理中,尽量保留图像细节特征条件下,对噪声进行抑制

    平滑化和滤波操作:图像的能大部分集中在幅度谱的低频和中频段,在较高频段,有用信息经常被噪声淹没

    滤波操作目的:1.特征模式识别2.消除噪声

    平滑滤波:一类为模糊,另一类为消除噪音

    五种平滑滤波的滤波器函数:

    1.方框滤波BoxBlur 2.均值滤波Blur 3.高斯滤波 GaussianBlur 4.中值滤波medianBlur 5.双边滤波 bilateralFilter

    其中前三种为线性滤波器,后二种为非线性滤波器

    低通为模糊,高通为锐化,其本质都是滤波操作

    邻域滤波(卷积):本质是根据给定的掩膜进行对中心像素进行的改变权值操作

    算子如图

    其权重核被称为滤波系数:g=f*h

    方框滤波:最简单的线性滤波操作,看图

    函数原型:void boxFilter(InputArray src,OutputArray dst,int ddepth,Size ksize,Point anchor=Point(-1,-1),boolnormalize = true,int  borderType=BORDER_DEFAULT)

    一参二参为输入输出图像,三参为输出图像深度,-1代表使用原图深度,即src.depth()

    图像深度:图像深度是单个像素点的色彩详细度,如16位(65536色),32位等。

    四参可理解为掩膜的尺寸,五参锚点(即被平滑的点),六参表示内核是否被归一化了,有默认值true,七参不用管

    测试程序:

    
    #include "opencv2/core/core.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <iostream>
    using namespace cv;
    
    int main()
    {
    	Mat src = imread("E://hashiqi.jpg");
    	imshow("原始图像", src);
    	Mat dst;
    	boxFilter(src, dst, -1, Size(5, 5), Point(-1, -1));
    	imshow("方框滤波", dst);
    	waitKey(0);
    	return 0;
    }
    

    测试结果:

    均值滤波:

    这就是跟方框滤波的区别,其它均保持一致

    
    blur(src, dst2, Size(5, 5));

    测试结果:

    均值滤波的缺陷:在去噪的过程中,不能很好的保护图片细节

    高斯模糊:同样是一种加权取均值的模糊做法,但是考虑了邻域点权值较大,距离远的点邻域的权值应该较小的情况(权值分布参考正态分布),这样做到的加权均值更合理,对于一些服从正态分布的噪声信息,能更高效地消除

    参数中sigmaX,sigmaY标准偏差,borderType还是一样,不用管

    GaussianBlur(src, dst3, Size(5, 5), 0, 0);

    测试结果如下:

    下面是结合TrackBar滑动条,修改掩膜尺寸,动态查看三种线性滤波的变换

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    using namespace std;
    using namespace cv;
    
    Mat src, dst1,dst2,dst3;
    static int blur_value = 3;
    static int box_value = 3;
    static int gauss_value = 3;
    
    static void on_blur(int, void*);
    static void on_box(int, void*);
    static void on_gauss(int, void*);
    int main(int argc, char** argv) {
    
    	src = imread("E://hashiqi.jpg", 0);
    	imshow("原始图像", src);
    	namedWindow("均值滤波", 1);
    	createTrackbar("内核值", "均值滤波", &blur_value, 40, on_blur);
    	namedWindow("方框滤波", 1);
    	createTrackbar("内核值", "方框滤波", &box_value, 40, on_box);
    	namedWindow("高斯滤波", 1);
    	createTrackbar("内核值", "高斯滤波",&gauss_value,40,on_gauss);
    	on_gauss(gauss_value, 0);
    	on_box(box_value, 0);
    	on_blur(blur_value, 0);
    	waitKey(0);
    }
    static void on_blur(int, void*) {
    	blur(src, dst1, Size(blur_value, blur_value), Point(-1, -1));
    	imshow("均值滤波", dst1);
    }
    static void on_box(int, void*) {
    
    	boxFilter(src, dst2, -1, Size(box_value, box_value));
    	imshow("方框滤波", dst2);
    }
    static void on_gauss(int, void*) {
    	GaussianBlur(src, dst3, Size(gauss_value, gauss_value), 0, 0);
    	imshow("高斯滤波", dst3);
    }

    下面是两种非线性的滤波方式,中值滤波和双边滤波

    中值滤波:

    基本思想:使用像素点邻域灰度值的中值来代替该像素点的灰度值,但其滤波过程不是加权的,该方法在去除脉冲噪声,椒盐噪声的同时又能保留图像的边缘细节

    函数原型:void medianBlur(InputArray src,OutputArray dst,int ksize);

    medianBlur(src, dst4, media_value);

    双边过滤:

    高斯滤波的思想,离中心越近的按正态分布来说,权值更大,但是有些情况下,信息值高的像素点分布在边缘,给定权值一少了之后,会丢失大量图像细节

    本质就是比高斯滤波加了一个高斯方差,保证边缘像素点的权值不至于少的可怜,影响太多,这样就保证了边缘附近像素点的保留。但是对高频噪声,双边过滤不能干净地过滤掉,只能对于低频信息进行很好的过滤。

    函数原型:void bilateralFiliter(InputAttay src,OutputArray dst,int d,double sigmaColor,double sigmaSpace,int borderType = BORDER_DAULT)

    bilateralFilter(src, dst4, bli_value, bli_value * 2, bli_value / 2);

    三参:表示每个像素邻域的直径 四参:sigmaColor这个值越大,代表像素邻域内有越宽广的颜色会被混合到一起,从而产生相对的半相等颜色区域 五参:坐标空间中滤波器的sigma值,坐标空间的标注方差,通俗的说,参数值越大,越远的像素会相互影响,是更大区域的颜色归一化。

    以上是基础的五种滤波方式,三种线性的,两种非线性的,基本上都是低频滤波,也就是模糊操作。

    展开全文
  • 这篇文章,是从我的《高效开发人员的五特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。1. 要看书。在成千上万的编程图书中,可能很一部分根本毫无用处。但是仍然...
  • 一般来说,让类成员指向动态分配内存很有用。如果程序员在类构造函数中使用new来分配动态内存,就 有责任提供适当析构函数,定义显式复制构造函数和显式赋值操作符。本章介绍了在程序员没有提供显 式定义时,...
  • 一般来说,让类成员指向动态分配内存很有用。如果程序员在类构造函数中使用new来分配动态内存,就 有责任提供适当析构函数,定义显式复制构造函数和显式赋值操作符。本章介绍了在程序员没有提供显 式定义时,...
  • 一般来说,让类成员指向动态分配内存很有用。如果程序员在类构造函数中使用new来分配动态内存,就 有责任提供适当析构函数,定义显式复制构造函数和显式赋值操作符。本章介绍了在程序员没有提供显 式定义时,...
  • 一般来说,让类成员指向动态分配内存很有用。如果程序员在类构造函数中使用new来分配动态内存,就 有责任提供适当析构函数,定义显式复制构造函数和显式赋值操作符。本章介绍了在程序员没有提供显 式定义时,...
  • 决策树(DecisionTree)

    2020-10-08 16:47:08
    在实际应用中,受限于它简单性,决策树更大的用处是作为一些更有用的算法基石,例如随机森林。 二、决策树优缺点 优点:计算复杂度不高,输出结果易于理解;对中间值缺失不敏感;可以处理不相关的特征数据; ...
  • 好!谨记!

    2019-09-22 22:07:05
    这篇文章,是从我的《高效开发人员的五特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。 1. 要看书。在成千上万的编程图书中,可能很一部分根本毫无用处。但是...
  • 这篇文章,是从我的《高效开发人员的五特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。   1. 要看书。在成千上万的编程图书中,可能很一部分根本毫无用处。...
  • 这篇文章,是从我的《高效开发人员的五特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。 1. 要看书。 在成千上万的编程图书中,可能很一部分根本毫无用处。但是...
  • 这篇文章,是从我的《高效开发人员的五特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。 1. 要看书。在成千上万的编程图书中,可能很一部分根本毫无用处。但是...
  • 这篇文章,是从我的《高效开发人员的五特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。 1. 要看书。在成千上万的编程图书中,可能很一部分根本毫无用处。但是...
  • 贯通新技术十种方法

    千次阅读 2008-06-11 12:56:00
    很久以前翻译的文章,原链接已经找不到了……这篇文章,是从我的《高效开发人员的五特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。1. 要看书。在成千上万的编程...
  • 这篇文章,是从我的《高效开发人员的五特征》一文中抽出的一个观点。从我自身的事业和习惯中,我考虑了很多方式怎么样才能有效地学习。1. 要看书。在成千上万的编程图书中,可能很一部分根本毫无用处。但是仍然...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 134
精华内容 53
关键字:

有用信息的五大特征