精华内容
下载资源
问答
  • 分享下我常用的客户开发方法及思路
    千次阅读
    2019-11-25 09:55:50

    一、浅谈下什么是客户开发?

    1.What-了解下什么是客户开发?

    客户开发是销售工作的第一步,通常来讲是业务人员通过市场调查初步了解市场和客户情况,对有实力和有意向的客户重点沟通,最终完成目标区域的客户开发计划。但以上只是一个企业客户开发工作中的冰山一角,要成功做好企业的客户开发工作,企业需要从自身资源情况出发,了解竞争对手在客户方面的一些策略性打法,制定适合自身企业的客户开发战略,再落实到销售一线人员客户开发执行,这是一个系统的工程。

    2.Why-为什么要进行客户开发?

    在竞争激烈的市场中,能否通过有效的方法获取客户资源往往是企业成败的关键。况且客户越来越明白如何满足自己的需要和维护自己的利益,客户是很难获得长期保持的。因此加强客户开发对企业的发展起着至关重要的作用。

    3.How-如何进行有效的客户开发?

    客户开发的前提是确定目标市场,研究目标顾客,从而制定客户开发市场营销策略。营销人员的首要任务是开发准客户,通过多种方法寻找准客户并对准客户进行资格鉴定,使企业的营销活动有明确的目标与方向,将潜在客户转化成现有客户。

    二、在开发客户前我们应该准备什么?

    1.充分了解自己所处的行业:是属于机械类,化工类,电子类,还是礼品类等

    2.充分了解公司的产品类型:是属于消费品,工业半成品,还是原材料等

    3.分析了解公司的市场定位:高端(欧美),中低端(东南亚,南美,非洲)等

    4.分析要开发的客户类型:是分销商,零售商,贸易商,代理商,还是制造商等

    5.分析公司的优劣势:市场定位,规模,历史,行业地位等

    6.分析并对比同行产品优劣势:价格优势,质量优势,交期,付款方式等

    7.学会分析调研,了解产品当前市场容量及未来发展的趋势和前景

    8.需要掌握哪些外贸相关业务知识和学习哪些系统业务操作流程

    9.对客户所在国和国家政策,进出口要求和港口等需要有一定的背景了解

    10 .了解个人是否具备吃苦耐劳的精神和超强的抗压能力,好的心态

    三、目前主要的客户开发方式有哪些?

    1.我自己比较常用的搜索引擎方式(Google,Bing,Yahoo)「后两者都不用FQ,Google用不了的情况下可以作补充,也能搜到一些客户信息,但是没有Google万能和全面,请按需使用」

    2.谷歌地图(Google map //t.cn/E9UL09f)目前来说,这种方式还是比较新型的客户开发方式,同行用的还比较少,其实很多国外比较高质量的采购商,在谷歌地图上都是可以找到的,而且可以找到联系方式,最主要的是信息精准,高效,可以结合展会,地图去开发。

    3.SNS社媒平台方式(Linkedin,Instagram,Youtube,Facebook)「建议深耕前面3个,可能是我一直认为facebook太杂太乱的原因吧,也可能是因为官方老是动不动就封你账号,所以有点不爽它哈哈,另外如果要做有质量的内容营销的话,还是Linkedin专业一些,视频营销会是未来的一个趋势,所以Youtube也是需要提前布局了」

    4.即时在线聊天工具(Skype,WhatsApp,Wechat,QQ)「后面2个主流的聊天工具不多做介绍,大家都玩了很多年了。Skype可以用客户Email去搜,搜到有联系人的话,那么恭喜你,赶紧跟他尬聊吧,谈谈不要钱,谈谈不要命,WhatsApp可以在通讯录里先添加客户手机号码,然后看App里面有匹配到联系人的话也可以去尬聊了,方法同上」

    5.B2B平台开发(Alibaba,Globalsources,MIC,Tradekey)「付费的平台,如果公司有的话,前期还是花上一些时间去上传产品和优化吧,虽然说B2B在如今的趋势下效果不是很好,但是也要看产品类型的,有总比没有好,所以要多做尝试,会有不一样的收获,主动开发 被动等客户询盘两者相结合,双管齐下,才是业绩提升的关键」

    6.参展 地推(海外参展/拜访客户,香港行业展,广交会等)「很多公司在这块都会有投入,因为展会来的客户还是比较直接的,除去复杂的邮件和电话沟通,面对面的交流更能与客户建立直接信任感,时间成本也会大大降低,也许你几十上百封邮件没法拿下的客户,见一面他就下单了,这是说不准的,关键还是要看眼缘,客户看中的是你这个人,是否可以让他放心的把订单交给你,所以说你的专业 细心是拿下客户的关键」

    7.付费搜索软件

    8.各国黄页网站

    9.海关数据(米课海关数据,特意海关数据,蓝鸣海关数据,外贸圈海关数据等)

    10.行业协会搜索(维基百科trade association 或谷歌搜索list of xx industry trade)

    11.展会名录(谷歌直接搜索list of 行业 exhibition或搜XX产品 exhibition list)

    四、如何利用Email开发客户?

    写开发信的前提:「5问思路」

    为什么要写给客户?写什么内容?要达成什么目的?希望客户下一步怎么做?客户为什么一定要回复你?

    一、传统式开发:可参照的开发信时间节点

    第1天:第1封邮件 –敲门砖-切入式开发信

    隔天或者第3天:第2/3封邮件-基础的客户跟进

    第5天:第4封邮件-周末祝福或节日祝福

    第2个星期:第5封邮件 – 邮件里提及Call to action,争取得到客户正面回复

    客户不回复继续跟进第6封,第7封-10封等,找不同的切入点跟进客户。

    个人总结:

    「在此期间,如果提前得知客户的其它联系方式的话,可以在邮件发出后给客户跟进一个电话,提醒客户查看邮件,或者在Skype/whatsApp/Linkedin上给客户留言,前期就是为了刷存在感,让客户注意到自己,但是要注意的一点就是在这个过程中跟进不要太频繁,你传递的信息也要是对客户有价值的东西,才不会引起客户反感哦」

    二、冰大式Mail Group开发思路:

    邮件内容&主题:

    1.初次联系客户,简单介绍自己和公司

    2.根据客户市场,推荐热销产品

    3.发产品目录,供客户了解

    4.发产品认证及验厂报告

    5.发参展图片,展会优势

    6.发工厂和样品间图片

    7.已合作的大客户,展示实力

    8.发常规报价单,供客户参考

    9.新品,促销优惠等

    个人总结:

    这是一整套组合拳,每封邮件的时间间隔可以按自己的喜好来设置,可以在一天内完成所有步骤,前提是要确保你的邮件质量,要有针对性,不要模板化,控制好邮件大小;针对性客户开发,我认为这套拳法用在大客户身上非常有效,而且时间有限,要把有限的时间用在刀刃上,大客户做背景调研,然后呢针对性的做Mail Group来突出我方的专业与优势,分分钟秒杀同行几条街,只要邮件写的好,能戳到客户的痛点,回复率很高;而小客户呢,不是不建议用,而是用另外的一种方式,即模板型的Mail Group来开发,你可以在发开发信之前,先按大纲制作出一套Mail Group模板,之后再不断精进和改良,小客户就可以用这套来开发,而大客户就针对性的写新的Mail Group去开发,区分开来,不能一把抓,否则效果就差很多了。

    同样的Mail Group,不一样的配方

    三、BD mail 思路:

    (核心是简洁,一剑封喉,一下子吸引住客户的眼球,引起客户好奇,同时又具备Mail Group的核心思想)

    1.Re:Re:Re:Offer Recap

    Hi Craig,

    Offer sheet attached.

    2.Re:Re:Re:Sample Photos

    Hi Craig,

    FYI.

    3.Re:Re:Re:Project updated

    Hi Craig,

    Please check attachment, Thanks.

    4.Re:Re:Re:About产品名 PI

    Hi Craig,

    Double-Checked.

    个人总结:

    以上模板只是给大家提供的一个思路而已,邮件主题和内容可以根据自己的习惯去设计和调整,大家记住核心思想然后自由发挥就行了,重要的一点是要“出其不意攻其不备”。

    五、如何利用SNS平台开发客户?

    随着社交网络日益壮大,比如LinkedIn,Facebook,不利用起来太可惜了。而且5G时代的到来,预示着视频营销将是未来的一个发展趋势,Youtube也要提前布局起来,这将是一块蓝海市场。

    对于小白,SNS可以怎么用呢?我一般是这样玩的,大家也可以参照下。

    1.Google结合Linkedin找客户公司具体负责人,加好友联系

    2.Linkedin或Facebook直接搜产品或行业关键词找到客户,加好友联系

    3.利用产品关键词搜Group,加入后Post动态并适当添加对口的客户尬聊

    4.前期加好友,后期维护,时不时跟客户互动下,say hello混个脸熟

    5.写文章,做内容营销,向客户传递有价值的信息,建立个人IP,让客户时刻记住你(重点)

    基于文案内容怎么写,大家可以报名颜Sir的社交成单课或者参考3岁小姐姐的文章,这里我就不再强调了。

    个人总结:

    在客户开发方面,我认为对营销比较重要的一点还是基于对产品的了解和产品卖点的打造,任何一个销售,在开发客户前,都必须要对自己的产品有所了解。试想下,一个对自己产品都不懂的业务员,凭什么能够让客户信任他并且下单呢?所以呢开发客户不仅仅是要了解业务、行业以及市场知识外,还要对产品的功能,参数有一定的了解,更要清楚地知道产品的卖点究竟是什么?为什么客户一定要从你这里买,而不是别的供应商?

    基于产品卖点的打造,请参考以下补充:

    六、如何打造吸引客户的卖点?

    一、卖点的3大标准:

    1.区隔竞争对手,即竞争对手做不到,竞争对手不敢承诺,竞争对手还没有宣传出来的,你已经把它做到,并且能够承诺,你就应该率先提出,这样就很容易获取客户信赖。

    2.自身有实力做到,卖点不是忽悠客户的口号,而是强有力的承诺。必须经得起市场和客户的考验。如京东凭借其物流实力推出“当日达”和“次日达”口号,假如没做到,就会砸掉自己的招牌,陷入公关危机当中。

    3.可感知和衡量的价值,即在满足区隔竞争对手和自身有实力做到的卖点,并不一定迎合市场的需求,一个成功的卖点必须是消费者渴望得到的,并且是可感知和可衡量的。

    二、具体点,可以分为这几个角度:

    1.价格(价格是影响消费者决策的重要因素,透明化或者可比性较强的产品以价格作为卖点,在很大程度能够杀出一条血路。例如:瓜子二手车的卖点是“没有中间商赚差价”,这就意味着车主可以花更低的价格买到质量相同的车;沃尔玛的卖点是“天天低价”,吸引家庭主妇每天光顾;无锡市某拉杆箱商家的卖点是“厂家直销,价格便宜40%,比比就知道”。)

    2.服务(顾客不仅仅消费产品,很多时候服务也是消费者购买会考虑的因素。这里的服务包括现场的服务和售后服务。如果能在服务上提出可衡量的标准,不仅可以瞬间吸引客户,还可以形成口碑传播。如海底捞凭借其不可撼动的服务标准让客户折服(上厕所洗手也有服务员递上擦手纸巾);某水果店的卖点是“购满20元,2公里内加1元提供定时送货上门服务”;麻辣烫店的卖点是“用山泉水烫菜,1小时换一锅水”。)

    3.效率(人们都渴望快速获得自己需要的产品价值,尤其是在市场竞争激烈的形式下,高效率地满足客户的需求,是这个快节奏时代客户的要求。比如:快餐店主打“半小时送到,否则半价”;建站网络培训教程主打“零基础1小时学会建站,否则退款”;快递公司主打“隔日送达”;润喉糖主打“金嗓子喉片,入口见效”)

    4.质量(产品质量是客户最关注的一点。假如自己产品质量过硬,请不要吝啬,大胆喊出来。例如:某羊毛衫的卖点“水洗不变形,1年变形免费换”;某牛仔裤的卖点“高弹力牛仔裤,进店给你劈叉做演示!)

    5.稀缺(“物以稀为贵”是对人性的深刻认知,不管是因为原材料的稀缺还是生产数量的稀缺,都会极大提升产品在消费者内心的价值感。比如:某桃花酒的卖点是“采取祖传工艺酿制,每年限供2000坛”;某土鸡餐饮店的卖点是“因为农村土鸡量有限,每天仅为50个客人提供土鸡宴,需提前3天预定”)

    6.方便(客户都喜欢方便,不愿意麻烦,假如你的产品和服务能够让客户方便,以此卖点为宣传,能吸引一大批嫌麻烦的客户。比如:某酒楼卖点是“内设停车场,提供特惠洗车服务”;宾馆的卖点是“只要市内,一个电话,免费派车接送”;礼物说卖点是“一个APP,帮你选【全球好货】的 App,带你逛遍全世界的好东西,送出感动ta的礼物”)

    7.实力(强大的实力能够让客户对你的产品和服务放心,这种实力来源于过往的成绩、技术、产品资质等。英语培训社的卖点是“70%均为美国特聘外籍教师,英语发音最地道”;某音响公司的卖点是“10年的品牌,服务的客户共计12W”;某补习社的卖点是“每年大学升学率高达82%”)

    8.附加值(在提供同样的主营产品,你比竞争对手额外多提供价值,客户会优先选择你。比如:早餐店的卖点是“买任意一款点心,即可免费获得一杯价值5元的豆浆”;某面馆的卖点是“消费任意一款面,均可获得一碗美味浓骨汤”)

    9.选择(为什么客户会出现“货比三家”,因为人们往往喜欢更多的选择进行对比,以挑选出自己最喜欢的东西。利用更多选择作为卖点,能吸引特定客户的关注。比如:自助餐的卖点是“只需要50元,108种菜式任你随便吃”)

    创造出很不错的卖点后,我们还需要一个步骤,叫卖点证明。没有事实和数据证明的卖点都是夸夸其谈,缺乏说服力,客户和消费者只会一笑置之。

    无论是500强大企业,还是中小企业,在新产品推出或者产品竞争白热化的时候,一个强有力的卖点往往能够让产品快速打开局面,在消费者心中占据一席之地。

    本文我主要从以上几个方面去阐述了自己对客户开发的一知片解,总体上来说,就是:

    客户开发=寻找客户 联系客户 卖点打造吸引客户 跟进谈判客户 促进客户成交

    在大体内容上可能有些写的不是很详尽,了解的层面也不够深入,但我会不断地去学习新的知识和继续完善这个开发体系,慢慢打磨,打好基础,希望有质变的那一天,同时呢也希望我这个外贸新人的一点总结能够对还处在迷茫阶段中的你有所帮助,有所启发。

    更多相关内容
  • 12种降维方法及python实现

    千次阅读 2021-01-15 14:49:19
    你遇到过特征超过1000个的数据集吗?...为此,我们需要一更好的方法来处理高维数据,比如本文介绍的降维:一能在减少数据集中特征数量的同时,避免丢失太多信息并保持/改进模型性能的方法。 什么是降维? 每

    你遇到过特征超过1000个的数据集吗?超过5万个的呢?我遇到过。降维是一个非常具有挑战性的任务,尤其是当你不知道该从哪里开始的时候。拥有这么多变量既是一个恩惠——数据量越大,分析结果越可信;也是一种诅咒——你真的会感到一片茫然,无从下手。

    面对这么多特征,在微观层面分析每个变量显然不可行,因为这至少要几天甚至几个月,而这背后的时间成本是难以估计的。为此,我们需要一种更好的方法来处理高维数据,比如本文介绍的降维:一种能在减少数据集中特征数量的同时,避免丢失太多信息并保持/改进模型性能的方法。

    什么是降维?

    每天,我们都会生成大量数据,而事实上,现在世界上约90%的数据都是在过去3到4年中产生的,这是个令人难以置信的现实。下面是收集数据的几个示例:

    Facebook会收集你喜欢、分享、发布、访问的内容等数据,比如你喜欢哪家餐厅。
    智能手机中的各类应用会收集大量关于你的个人信息,比如你所在的地点。
    淘宝会收集你在其网站上购买、查看、点击的内容等数据。
    赌场会跟踪每位客户的每一步行动。
    随着数据的生成和数据收集量的不断增加,可视化和绘制推理图变得越来越困难。一般情况下,我们经常会通过绘制图表来可视化数据,比如假设我们手头有两个变量,一个年龄,一个身高。我们就可以绘制散点图或折线图,轻松反映它们之间的关系。

    下图是一个简单的例子:
    在这里插入图片描述
    横坐标X1的单位为“千克”,纵坐标X2的单位为“磅”。可以发现,虽然是两个变量,但它们传达的信息是一致的,即物体的重量。所以我们只需选用其中的一个就能保留原始意义,把2维数据压缩到1维(Y1)后,上图就变成:
    在这里插入图片描述
    类似地,我们可以把数据从原本的p维转变为一系列k维的子集(k<<n),这就是降维。

    为什么要降维?

    以下是在数据集中应用降维的用处:

    1. 随着数据维度不断降低,数据存储所需的空间也会随之减少。
    2. 低维数据有助于减少计算/训练用时。
    3. 一些算法在高维度数据上容易表现不佳,降维可提高算法可用性。
    4. 降维可以用删除冗余特征解决多重共线性问题。比如我们有两个变量:“一段时间内在跑步机上的耗时”和“卡路里消耗量”。这两个变量高度相关,在跑步机上花的时间越长,燃烧的卡路里自然就越多。因此,同时存储这两个数据意义不大,只需一个就够了。
    5. 降维有助于数据可视化。如前所述,如果数据维度很高,可视化会变得相当困难,而绘制二维三维数据的图表非常简单。

    降维技术一览

    数据维度的降低方法主要有两种:

    1. 仅保留原始数据集中最相关的变量(特征选择)。
    2. 寻找一组较小的新变量,其中每个变量都是输入变量的组合,包含与输入变量基本相同的信息(降维)。

    1. 缺失值比率(Missing Value Ratio)

    假设你有一个数据集,你第一步会做什么?在构建模型前,对数据进行探索性分析必不可少。但在浏览数据的过程中,有时候我们会发现其中包含不少缺失值。如果缺失值少,我们可以填补缺失值或直接删除这个变量;如果缺失值过多,你会怎么办呢?

    当缺失值在数据集中的占比过高时,一般我会选择直接删除这个变量,因为它包含的信息太少了。但具体删不删、怎么删需要视情况而定,我们可以设置一个阈值,如果缺失值占比高于阈值,删除它所在的列。阈值越高,降维方法越积极。

    下面是具体代码:

    # 导入需要的库
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    #缺失值比率(Missing Value Ratio),过滤指标,传入数据和需要计算的列
    def MissingValueRatio(data,index_column):
        # #计算空值率
        null_ratio = data.loc[:, index_column].isnull().sum() / len(data) * 100
        new_columns = []
        for i in index_column:
            if null_ratio[i] <= 20:  # setting the threshold as 20%
                new_columns.append(i)
        print(null_ratio)
        print(new_columns)
    
        #计算值=0的率
        # zero_ratios = {}
        # for act_column in index_column:
        #     #计算每列中每个值出现次数,获取为0的次数tt[0.0],计算出现率
        #     tt = data[act_column].value_counts()
        #     zero_ratio = tt[0.0] / len(data) * 100
        #     zero_ratios[act_column] = zero_ratio
        # print(zero_ratios)
        # new_columns = []
        # for k, v in zero_ratios.items():
        #     if v < 20:
        #         new_columns.append(k)
        # print(new_columns)
        return new_columns
    

    2. 低方差滤波(Low Variance Filter)

    如果我们有一个数据集,其中某列的数值基本一致,也就是它的方差非常低,那么这个变量还有价值吗?和上一种方法的思路一致,我们通常认为低方差变量携带的信息量也很少,所以可以把它直接删除。

    放到实践中,就是先计算所有变量的方差大小,然后删去其中最小的几个。需要注意的一点是:方差与数据范围相关的,因此在采用该方法前需要对数据做归一化处理。

    #低方差滤波(Low Variance Filter),过滤指标,传入数据和需要计算的列,其中某列的数值基本一致,也就是它的方差非常低
    def LowVarianceFilter(data,index_column):
        #计算每个指标的方差
        var = data.loc[:, index_column].var()
        new_columns = []
        for i in index_column:
            if var[i] > 10:  # setting the threshold as 20%
                new_columns.append(i)
        print(var)
        print(new_columns)
        return new_columns
    

    以上代码帮我们列出了方差大于10的所有变量。

    3. 高相关滤波(High Correlation filter)

    如果两个变量之间是高度相关的,这意味着它们具有相似的趋势并且可能携带类似的信息。同理,这类变量的存在会降低某些模型的性能(例如线性和逻辑回归模型)。为了解决这个问题,我们可以计算独立数值变量之间的相关性。如果相关系数超过某个阈值,就删除其中一个变量。

    作为一般准则,我们应该保留那些与目标变量显示相当或高相关性的变量。

    #高相关滤波(High Correlation filter),过滤指标,传入数据喝需要计算的列,如果两个变量之间是高度相关的,这意味着它们具有相似的趋势并且可能携带类似的信息。
    def HighCorrelationFilter(data,index_column):
        #计算每个指标的方差
        corr = data.loc[:, index_column].corr()
        print(corr)
        for i in index_column:
            for j in index_column:
                if corr[i][j] > 0.5 and i != j:  # setting the threshold as 20%
                    print(i,j,corr[i][j])
                    index_column.remove(j)
        new_columns = index_column
        print(new_columns)
        return new_columns
    

    如上表所示,示例数据集中不存在高相关变量,但通常情况下,如果一对变量之间的相关性大于0.5-0.6,那就应该考虑是否要删除一列了。

    4. 随机森林(Random Forest)

    随机森林是一种广泛使用的特征选择算法,它会自动计算各个特征的重要性,所以无需单独编程。这有助于我们选择较小的特征子集。

    在开始降维前,我们先把数据转换成数字格式,因为随机森林只接受数字输入。可以直接使用SelectFromModel,它根据权重的重要性选择特征。

    from sklearn.ensemble import RandomForestRegressor
    
    
    # 随机森林(Random Forest)
    def RandomorestropDimension(data,index_column,score_column):
        df = data.loc[:, index_column]
        score_df = data.loc[:, score_column]
        model = RandomForestRegressor(random_state=1, max_depth=10)
        model.fit(df, score_df)
        features = df.columns
        print(features)
        importances = model.feature_importances_ #特征重要性
        print(importances)
        #确定特征数,根据特征重要性排序筛选特征
        feature = SelectFromModel(model)
        fit = feature.fit_transform(df, score_df)
        column_num = fit.shape[1]
        #np.argsort(x) #按升序排列 np.argsort(-x) #按降序排列 取索引
        indices = np.argsort(-importances)
        print(indices)
        new_columns = []
        for c in range(column_num):
            new_columns.append(features[indices[c]])
        print(new_columns)
        return new_columns
    

    5. 反向特征消除(Backward Feature Elimination)

    以下是反向特征消除的主要步骤:

    先获取数据集中的全部n个变量,然后用它们训练一个模型。
    计算模型的性能。
    在删除每个变量(n次)后计算模型的性能,即我们每次都去掉一个变量,用剩余的n-1个变量训练模型。
    确定对模型性能影响最小的变量,把它删除。
    重复此过程,直到不再能删除任何变量。
    在构建线性回归或Logistic回归模型时,可以使用这种方法。

    from sklearn.linear_model import LinearRegression
    from sklearn.feature_selection import RFE
    from sklearn import datasets
    lreg = LinearRegression()
    rfe = RFE(lreg, 10)
    rfe = rfe.fit_transform(df, train.Item_Outlet_Sales)
    

    我们需要指定算法和要选择的特征数量,然后返回反向特征消除输出的变量列表。此外,rfe.ranking_可以用来检查变量排名。

    6. 前向特征选择(Forward Feature Selection)

    前向特征选择其实就是反向特征消除的相反过程,即找到能改善模型性能的最佳特征,而不是删除弱影响特征。它背后的思路如下所述:

    1. 选择一个特征,用每个特征训练模型n次,得到n个模型。
    2. 选择模型性能最佳的变量作为初始变量。
    3. 每次添加一个变量继续训练,重复上一过程,最后保留性能提升最大的变量。
    4. 一直添加,一直筛选,直到模型性能不再有明显提高。
    from sklearn.feature_selection import f_regression
    # 前向特征选择(Forward Feature Selection)前向特征选择其实就是反向特征消除的相反过程,即找到能改善模型性能的最佳特征
    def ForwardFeatureSelection(data,index_column,score_column):
        df = data.loc[:, index_column]
        score_df = data.loc[:, score_column]
        #F值越大,p值越小越好,这里我们选择F值大于10的变量
        ffs = f_regression(df,score_df )
        print(ffs)
        new_columns = []
        for i in range(0, len(df.columns) - 1):
            if ffs[0][i] >= 10:
                new_columns.append(df.columns[i])
        print(new_columns)
        return new_columns
    

    上述代码会返回一个数组,其中包括变量F值和每个F对应的p值(什么是F值)。在这里,我们选择F值大于10的变量。

    [注]:前向特征选择和反向特征消除耗时较久,计算成本也都很高,所以只适用于输入变量较少的数据集。

    7. 因子分析(Factor Analysis)

    因子分析是一种常见的统计方法,它能从多个变量中提取共性因子,并得到最优解。假设我们有两个变量:收入和教育。它们可能是高度相关的,因为总体来看,学历高的人一般收入也更高,反之亦然。所以它们可能存在一个潜在的共性因子,比如“能力”。

    在因子分析中,我们将变量按其相关性分组,即特定组内所有变量的相关性较高,组间变量的相关性较低。我们把每个组称为一个因子,它是多个变量的组合。和原始数据集的变量相比,这些因子在数量上更少,但携带的信息基本一致。
    用因子分析分解数据集:

    from sklearn.decomposition import FactorAnalysis
    # 因子分析(Factor Analysis),返回降维后的新数据
    def FactorAnalysisFeatureSelection(data,index_column):
        df = data.loc[:, index_column]
        fa = FactorAnalysis(n_components=7)  # 指定7个因子作为新变量
        fa.fit(df)
        tran_x = fa.transform(df)
        factor_columns = []
        for index in range(7):
            tmp = "factor" + str(index + 1)
            factor_columns.append(tmp)
        tran_df = pd.DataFrame(tran_x, columns=factor_columns)
        return tran_df
    

    这里,n_components将决定转换数据中的因子数量。

    8. 主成分分析(PCA)

    如果说因子分析是假设存在一系列潜在因子,能反映变量携带的信息,那PCA就是通过正交变换将原始的n维数据集变换到一个新的被称做主成分的数据集中,即从现有的大量变量中提取一组新的变量。下面是关于PCA的一些要点:

    主成分是原始变量的线性组合。

    1. 第一个主成分具有最大的方差值。
    2. 第二主成分试图解释数据集中的剩余方差,并且与第一主成分不相关(正交)。
    3. 第三主成分试图解释前两个主成分等没有解释的方差。

    实现PCA:

    from sklearn.decomposition import PCA
    #PCA数据降维
    def PCADropDimension(data,index_column):
        df = data.loc[:, index_column]
        # PCA(copy=True, n_components=2, whiten=False)
        # n_components: 我们可以利用此参数设置想要的特征维度数目,可以是int型的数字,也可以是阈值百分比,如95 %,让PCA类根据样本特征方差来降到合适的维数,也可以指定为string类型,MLE。
        # copy: bool类型,TRUE或者FALSE,是否将原始数据复制一份,这样运行后原始数据值不会改变,默认为TRUE。
        # whiten:bool类型,是否进行白化(就是对降维后的数据进行归一化,使方差为1),默认为FALSE。如果需要后续处理可以改为TRUE。
        pca = decomposition.PCA(n_components=7)  # n_components:目标维度
        pca.fit(df)
        print(pca.explained_variance_ratio_)  #输出贡献率
        print(pca.explained_variance_)  # 输出方差值,方差值越大,表明越重要
        print(pca.n_features_)
        print(pca.n_features_in_)
        #降维后数据
        newdf = pca.fit_transform(df)
        factor_columns = []
        for index in range(7):
            tmp = "factor" + str(index + 1)
            factor_columns.append(tmp)
        tran_df = pd.DataFrame(newdf, columns=factor_columns)
        print(tran_df) #输出降维后的数据
        #将降维后的数据转换成原始数据
        # X = pca.inverse_transform(newdf)
        return tran_df
    

    其中n_components将决定转换数据中的主成分。接下来,我们看一下这四个主成分解释了多少方差:

    plt.plot(range(7), pca.explained_variance_ratio_)
    plt.plot(range(7), np.cumsum(pca.explained_variance_ratio_))
    plt.title("Component-wise and Cumulative Explained Variance")
    

    在上图中,蓝线表示分量解释的方差,而橙线表示累积解释的方差。我们只用四个成分就解释了数据集中约90%的方差。
    在这里插入图片描述

    9. 独立分量分析(ICA)

    独立分量分析(ICA)基于信息理论,是最广泛使用的降维技术之一。PCA和ICA之间的主要区别在于,PCA寻找不相关的因素,而ICA寻找独立因素。

    如果两个变量不相关,它们之间就没有线性关系。如果它们是独立的,它们就不依赖于其他变量。例如,一个人的年龄和他吃了什么/看了什么电视无关。

    该算法假设给定变量是一些未知潜在变量的线性混合。它还假设这些潜在变量是相互独立的,即它们不依赖于其他变量,因此它们被称为观察数据的独立分量。

    下图是ICA和PCA的一个直观比较:
    在这里插入图片描述
    (a)PCA,(b)ICA
    PCA的等式是x = Wχ。
    这里,
    x是观察结果
    W是混合矩阵
    χ是来源或独立分量
    现在我们必须找到一个非混合矩阵,使分量尽可能独立。而测试分量独立性最常用的方法是非高斯性:

    根据中心极限定理(Central Limit Theorem),多个独立随机变量混合之后会趋向于正态分布(高斯分布)。
    在这里插入图片描述
    因此,我们可以寻找所有独立分量中能最大化峰度的分量。
    一旦峰度被最大化,整个分布会呈现非高斯分布,我们也能得到独立分量。

    在Python中实现ICA:

    from sklearn.decomposition import FastICA
    #独立分量分析(ICA)PCA和ICA之间的主要区别在于,PCA寻找不相关的因素,而ICA寻找独立因素。
    def ICADropDimension(data,index_column):
        df = data.loc[:, index_column]
        ICA = FastICA(n_components=7, random_state=12)
        newdf = ICA.fit_transform(df)
        factor_columns = []
        for index in range(7):
            tmp = "factor" + str(index + 1)
            factor_columns.append(tmp)
        tran_df = pd.DataFrame(newdf, columns=factor_columns)
        print(tran_df)  # 输出降维后的数据
        return tran_df
    

    10. IOSMAP

    代码:

    from sklearn import manifold 
    trans_data = manifold.Isomap(n_neighbors=5, n_components=3, n_jobs=-1).fit_transform(df[feat_cols][:6000].values)
    

    使用的参数:

    n_neighbors:决定每个点的相邻点数
    n_components:决定流形的坐标数
    n_jobs = -1:使用所有可用的CPU核心
    可视化:

    plt.figure(figsize=(12,8))
    plt.title('Decomposition using ISOMAP')
    plt.scatter(trans_data[:,0], trans_data[:,1])
    plt.scatter(trans_data[:,1], trans_data[:,2])
    plt.scatter(trans_data[:,2], trans_data[:,0])
    

    在这里插入图片描述

    11. t-SNE

    代码:

    from sklearn.manifold import TSNE 
    tsne = TSNE(n_components=3, n_iter=300).fit_transform(df[feat_cols][:6000].values)
    

    可视化:

    plt.figure(figsize=(12,8))
    plt.title('t-SNE components')
    plt.scatter(tsne[:,0], tsne[:,1])
    plt.scatter(tsne[:,1], tsne[:,2])
    plt.scatter(tsne[:,2], tsne[:,0])
    

    在这里插入图片描述

    12. UMAP

    代码:

    import umap
    umap_data = umap.UMAP(n_neighbors=5, min_dist=0.3, n_components=3).fit_transform(df[feat_cols][:6000].values)
    

    这里,

    n_neighbors:确定相邻点的数量。
    min_dist:控制允许嵌入的紧密程度,较大的值可确保嵌入点的分布更均匀。
    可视化:

    plt.figure(figsize=(12,8))
    plt.title('Decomposition using UMAP')
    plt.scatter(umap_data[:,0], umap_data[:,1])
    plt.scatter(umap_data[:,1], umap_data[:,2])
    plt.scatter(umap_data[:,2], umap_data[:,0])
    

    在这里插入图片描述

    总结

    到目前为止,我们已经介绍了12种降维/特征选择方法,考虑到篇幅,我们没有仔细编译后三种方法的原理,感兴趣的读者可以找资料查阅,因为它们中的任何一个都足够写一篇专门介绍的长文。本节会对这12种方法做一个总结,简要介绍它们的优点和缺点。

    缺失值比率:如果数据集的缺失值太多,我们可以用这种方法减少变量数。
    低方差滤波:这个方法可以从数据集中识别和删除常量变量,方差小的变量对目标变量影响不大,所以可以放心删去。
    高相关滤波:具有高相关性的一对变量会增加数据集中的多重共线性,所以用这种方法删去其中一个是有必要的。
    随机森林:这是最常用的降维方法之一,它会明确算出数据集中每个特征的重要性。
    前向特征选择和反向特征消除:这两种方法耗时较久,计算成本也都很高,所以只适用于输入变量较少的数据集。
    因子分析:这种方法适合数据集中存在高度相关的变量集的情况。
    PCA:这是处理线性数据最广泛使用的技术之一。
    ICA:我们可以用ICA将数据转换为独立的分量,使用更少的分量来描述数据。
    ISOMAP:适合非线性数据处理。
    t-SNE:也适合非线性数据处理,相较上一种方法,这种方法的可视化更直接。
    UMAP:适用于高维数据,与t-SNE相比,这种方法速度更快。

    参考
    Python实现PCA降维
    降维算法

    展开全文
  • 12种降维方法终极指南

    万次阅读 多人点赞 2018-09-03 15:51:38
    来源:Analytics Vidhya编译:Bot授权自 论智你遇到过特征超过1000个的数据集吗?超过5万个的呢?...也是一诅咒——你真的会感到一片茫然,无从下手。面对这么多特征,在微观层面分析每个变量显然不可...
    来源:Analytics Vidhya
    编译:Bot

    授权自 论智

    你遇到过特征超过1000个的数据集吗?超过5万个的呢?我遇到过。降维是一个非常具有挑战性的任务,尤其是当你不知道该从哪里开始的时候。拥有这么多变量既是一个恩惠——数据量越大,分析结果越可信;也是一种诅咒——你真的会感到一片茫然,无从下手。

    面对这么多特征,在微观层面分析每个变量显然不可行,因为这至少要几天甚至几个月,而这背后的时间成本是难以估计的。为此,我们需要一种更好的方法来处理高维数据,比如本文介绍的降维:一种能在减少数据集中特征数量的同时,避免丢失太多信息并保持/改进模型性能的方法。

    什么是降维?

    每天,我们都会生成大量数据,而事实上,现在世界上约90%的数据都是在过去3到4年中产生的,这是个令人难以置信的现实。如果你不信,下面是收集数据的几个示例:

    • Facebook会收集你喜欢、分享、发布、访问的内容等数据,比如你喜欢哪家餐厅。

    • 智能手机中的各类应用会收集大量关于你的个人信息,比如你所在的地点。

    • 淘宝会收集你在其网站上购买、查看、点击的内容等数据。

    • 赌场会跟踪每位客户的每一步行动。

    随着数据的生成和数据收集量的不断增加,可视化和绘制推理图变得越来越困难。一般情况下,我们经常会通过绘制图表来可视化数据,比如假设我们手头有两个变量,一个年龄,一个身高。我们就可以绘制散点图或折线图,轻松反映它们之间的关系。

    下图是一个简单的例子:

    其中横坐标X1的单位为“千克”,纵坐标X2的单位为“磅”。可以发现,虽然是两个变量,但它们传达的信息是一致的,即物体的重量。所以我们只需选用其中的一个就能保留原始意义,把2维数据压缩到1维(Y1)后,上图就变成:

    类似地,我们可以把数据从原本的p维转变为一系列k维的子集(k<<n),这就是降维。

    为什么要降维?

    以下是在数据集中应用降维的用处:

    • 随着数据维度不断降低,数据存储所需的空间也会随之减少。

    • 低维数据有助于减少计算/训练用时。

    • 一些算法在高维度数据上容易表现不佳,降维可提高算法可用性。

    • 降维可以用删除冗余特征解决多重共线性问题。比如我们有两个变量:“一段时间内在跑步机上的耗时”和“卡路里消耗量”。这两个变量高度相关,在跑步机上花的时间越长,燃烧的卡路里自然就越多。因此,同时存储这两个数据意义不大,只需一个就够了。

    • 降维有助于数据可视化。如前所述,如果数据维度很高,可视化会变得相当困难,而绘制二维三维数据的图表非常简单。

    数据集1:Big Mart Sales III

    降维技术一览

    数据维度的降低方法主要有两种:

    • 仅保留原始数据集中最相关的变量(特征选择)。

    • 寻找一组较小的新变量,其中每个变量都是输入变量的组合,包含与输入变量基本相同的信息(降维)。

    1. 缺失值比率(Missing Value Ratio)

    假设你有一个数据集,你第一步会做什么?在构建模型前,对数据进行探索性分析必不可少。但在浏览数据的过程中,有时候我们会发现其中包含不少缺失值。如果缺失值少,我们可以填补缺失值或直接删除这个变量;如果缺失值过多,你会怎么办呢?

    当缺失值在数据集中的占比过高时,一般我会选择直接删除这个变量,因为它包含的信息太少了。但具体删不删、怎么删需要视情况而定,我们可以设置一个阈值,如果缺失值占比高于阈值,删除它所在的列。阈值越高,降维方法越积极。

    下面是具体代码:

      
    1. # 导入需要的库

    2. import pandas as pd

    3. import numpy as np

    4. import matplotlib.pyplot as plt

    加载数据:

      
    1. # 读取数据

    2. train=pd.read_csv("Train_UWu5bXk.csv")

    [注]:应在读取数据时添加文件的路径。

    .isnull().sum()检查每个变量中缺失值的占比:

      
    1. train.isnull().sum()/len(train)*100

    如上表所示,缺失值很少。我们设阈值为20%:

      
    1. # 保存变量中的缺失值

    2. a = train.isnull().sum()/len(train)*100

    3. # 保存列名

    4. variables = train.columns

    5. variable = [ ]

    6. for i in range(0,12):

    7.    if a[i]<=20:   #setting the threshold as 20%

    8.        variable.append(variables[i])

    2. 低方差滤波(Low Variance Filter)

    如果我们有一个数据集,其中某列的数值基本一致,也就是它的方差非常低,那么这个变量还有价值吗?和上一种方法的思路一致,我们通常认为低方差变量携带的信息量也很少,所以可以把它直接删除。

    放到实践中,就是先计算所有变量的方差大小,然后删去其中最小的几个。需要注意的一点是:方差与数据范围相关的,因此在采用该方法前需要对数据做归一化处理。

    放在示例中,我们先估算缺失值:

      
    1. train['Item_Weight'].fillna(train['Item_Weight'].median, inplace=True)

    2. train['Outlet_Size'].fillna(train['Outlet_Size'].mode()[0], inplace=True)

    检查缺失值是否已经被填充:

      
    1. train.isnull().sum()/len(train)*100

    再计算所有数值变量的方差:

      
    1. train.var()

    如上图所示,和其他变量相比,Item_Visibility的方差非常小,因此可以把它直接删除。

      
    1. umeric = train[['Item_Weight', 'Item_Visibility', 'Item_MRP', 'Outlet_Establishment_Year']]

    2. var = numeric.var()

    3. numeric = numeric.columns

    4. variable = [ ]

    5. for i in range(0,len(var)):

    6.    if var[i]>=10:   # 将阈值设置为10%

    7.       variable.append(numeric[i+1])

    以上代码帮我们列出了方差大于10的所有变量。

    3. 高相关滤波(High Correlation filter)

    如果两个变量之间是高度相关的,这意味着它们具有相似的趋势并且可能携带类似的信息。同理,这类变量的存在会降低某些模型的性能(例如线性和逻辑回归模型)。为了解决这个问题,我们可以计算独立数值变量之间的相关性。如果相关系数超过某个阈值,就删除其中一个变量。

    作为一般准则,我们应该保留那些与目标变量显示相当或高相关性的变量。

    首先,删除因变量(ItemOutletSales),并将剩余的变量保存在新的数据列(df)中。

      
    1. df=train.drop('Item_Outlet_Sales', 1)

    2. df.corr()

    如上表所示,示例数据集中不存在高相关变量,但通常情况下,如果一对变量之间的相关性大于0.5-0.6,那就应该考虑是否要删除一列了。

    4. 随机森林(Random Forest)

    随机森林是一种广泛使用的特征选择算法,它会自动计算各个特征的重要性,所以无需单独编程。这有助于我们选择较小的特征子集。

    在开始降维前,我们先把数据转换成数字格式,因为随机森林只接受数字输入。同时,ID这个变量虽然是数字,但它目前并不重要,所以可以删去。

      
    1. from sklearn.ensemble import RandomForestRegressor

    2. df=df.drop(['Item_Identifier', 'Outlet_Identifier'], axis=1)

    3. model = RandomForestRegressor(random_state=1, max_depth=10)

    4. df=pd.get_dummies(df)

    5. model.fit(df,train.Item_Outlet_Sales)

    拟合模型后,根据特征的重要性绘制成图:

      
    1. features = df.columns

    2. importances = model.feature_importances_

    3. indices = np.argsort(importances[0:9])  # top 10 features

    4. plt.title('Feature Importances')

    5. plt.barh(range(len(indices)), importances[indices], color='b', align='center')

    6. plt.yticks(range(len(indices)), [features[i] for i in indices])

    7. plt.xlabel('Relative Importance')

    8. plt.show()

    基于上图,我们可以手动选择最顶层的特征来减少数据集中的维度。如果你用的是sklearn,可以直接使用SelectFromModel,它根据权重的重要性选择特征。

      
    1. from sklearn.feature_selection import SelectFromModel

    2. feature = SelectFromModel(model)

    3. Fit = feature.fit_transform(df, train.Item_Outlet_Sales)

    5. 反向特征消除(Backward Feature Elimination)

    以下是反向特征消除的主要步骤:

    • 先获取数据集中的全部n个变量,然后用它们训练一个模型。

    • 计算模型的性能。

    • 在删除每个变量(n次)后计算模型的性能,即我们每次都去掉一个变量,用剩余的n-1个变量训练模型。

    • 确定对模型性能影响最小的变量,把它删除。

    • 重复此过程,直到不再能删除任何变量。

    在构建线性回归或Logistic回归模型时,可以使用这种方法。

      
    1. from sklearn.linear_model import LinearRegression

    2. from sklearn.feature_selection import RFE

    3. from sklearn import datasets

    4. lreg = LinearRegression()

    5. rfe = RFE(lreg, 10)

    6. rfe = rfe.fit_transform(df, train.Item_Outlet_Sales)

    我们需要指定算法和要选择的特征数量,然后返回反向特征消除输出的变量列表。此外,rfe.ranking_可以用来检查变量排名。

    6. 前向特征选择(Forward Feature Selection)

    前向特征选择其实就是反向特征消除的相反过程,即找到能改善模型性能的最佳特征,而不是删除弱影响特征。它背后的思路如下所述:

    • 选择一个特征,用每个特征训练模型n次,得到n个模型。

    • 选择模型性能最佳的变量作为初始变量。

    • 每次添加一个变量继续训练,重复上一过程,最后保留性能提升最大的变量。

    • 一直添加,一直筛选,直到模型性能不再有明显提高。

      
    1. from sklearn.feature_selection import f_regression

    2. ffs = f_regression(df,train.Item_Outlet_Sales )

    上述代码会返回一个数组,其中包括变量F值和每个F对应的p值。在这里,我们选择F值大于10的变量:

      
    1. variable = [ ]

    2. for i in range(0,len(df.columns)-1):

    3.    if ffs[0][i] >=10:

    4.       variable.append(df.columns[i])

    [注]:前向特征选择和反向特征消除耗时较久,计算成本也都很高,所以只适用于输入变量较少的数据集。

    到目前为止,我们介绍的6种方法都能很好地解决示例的商场销售预测问题,因为这个数据集本身输入变量不多。在下文中,为了展示多变量数据集的降维方法,我们将把数据集改成Fashion MNIST,它共有70,000张图像,其中训练集60,000张,测试集10,000张。我们的目标是训练一个能分类各类服装配饰的模型。

    数据集2:Fashion MNIST

    7. 因子分析(Factor Analysis)

    因子分析是一种常见的统计方法,它能从多个变量中提取共性因子,并得到最优解。假设我们有两个变量:收入和教育。它们可能是高度相关的,因为总体来看,学历高的人一般收入也更高,反之亦然。所以它们可能存在一个潜在的共性因子,比如“能力”。

    在因子分析中,我们将变量按其相关性分组,即特定组内所有变量的相关性较高,组间变量的相关性较低。我们把每个组称为一个因子,它是多个变量的组合。和原始数据集的变量相比,这些因子在数量上更少,但携带的信息基本一致。

      
    1. import pandas as pd

    2. import numpy as np

    3. from glob import glob

    4. import cv2

    5. images = [cv2.imread(file) for file in glob('train/*.png')]

    [注]:你必须使用train文件夹的路径替换glob函数内的路径。

    现在我们先把这些图像转换为numpy数组格式,以便执行数学运算并绘制图像。

      
    1. images = np.array(images)

    2. images.shape

    返回:(60000, 28, 28, 3)

    如上所示,这是一个三维数组,但我们的目标是把它转成一维,因为后续只接受一维输入。所以我们还得展平图像:

      
    1. image = []

    2. for i in range(0,60000):

    3.    img = images[i].flatten()

    4.    image.append(img)

    5. image = np.array(image)

    创建一个数据框,其中包含每个像素的像素值,以及它们对应的标签:

      
    1. train = pd.read_csv("train.csv")     # Give the complete path of your train.csv file

    2. feat_cols = [ 'pixel'+str(i) for i in range(image.shape[1]) ]

    3. df = pd.DataFrame(image,columns=feat_cols)

    4. df['label'] = train['label']

    用因子分析分解数据集:

      
    1. from sklearn.decomposition import FactorAnalysis

    2. FA = FactorAnalysis(n_components = 3).fit_transform(df[feat_cols].values)

    这里,n_components将决定转换数据中的因子数量。转换完成后,可视化结果:

      
    1. %matplotlib inline

    2. import matplotlib.pyplot as plt

    3. plt.figure(figsize=(12,8))

    4. plt.title('Factor Analysis Components')

    5. plt.scatter(FA[:,0], FA[:,1])

    6. plt.scatter(FA[:,1], FA[:,2])

    7. plt.scatter(FA[:,2],FA[:,0])

    在上图中,x轴和y轴表示分解因子的值,虽然共性因子是潜在的,很难被观察到,但我们已经成功降维。

    8. 主成分分析(PCA)

    如果说因子分析是假设存在一系列潜在因子,能反映变量携带的信息,那PCA就是通过正交变换将原始的n维数据集变换到一个新的被称做主成分的数据集中,即从现有的大量变量中提取一组新的变量。下面是关于PCA的一些要点:

    • 主成分是原始变量的线性组合。

    • 第一个主成分具有最大的方差值。

    • 第二主成分试图解释数据集中的剩余方差,并且与第一主成分不相关(正交)。

    • 第三主成分试图解释前两个主成分等没有解释的方差。

    再进一步降维前,我们先随机绘制数据集中的某些图:

      
    1. rndperm = np.random.permutation(df.shape[0])

    2. plt.gray()

    3. fig = plt.figure(figsize=(20,10))

    4. for i in range(0,15):

    5.    ax = fig.add_subplot(3,5,i+1)

    6.    ax.matshow(df.loc[rndperm[i],feat_cols].values.reshape((28,28*3)).astype(float))

    实现PCA:

      
    1. from sklearn.decomposition import PCA

    2. pca = PCA(n_components=4)

    3. pca_result = pca.fit_transform(df[feat_cols].values)

    其中n_components将决定转换数据中的主成分。接下来,我们看一下这四个主成分解释了多少方差:

      
    1. plt.plot(range(4), pca.explained_variance_ratio_)

    2. plt.plot(range(4), np.cumsum(pca.explained_variance_ratio_))

    3. plt.title("Component-wise and Cumulative Explained Variance")

    在上图中,蓝线表示分量解释的方差,而橙线表示累积解释的方差。我们只用四个成分就解释了数据集中约60%的方差。

    9. 独立分量分析(ICA)

    独立分量分析(ICA)基于信息理论,是最广泛使用的降维技术之一。PCA和ICA之间的主要区别在于,PCA寻找不相关的因素,而ICA寻找独立因素。

    如果两个变量不相关,它们之间就没有线性关系。如果它们是独立的,它们就不依赖于其他变量。例如,一个人的年龄和他吃了什么/看了什么电视无关。

    该算法假设给定变量是一些未知潜在变量的线性混合。它还假设这些潜在变量是相互独立的,即它们不依赖于其他变量,因此它们被称为观察数据的独立分量。

    下图是ICA和PCA的一个直观比较:

    (a)PCA,(b)ICA

    PCA的等式是x = Wχ。

    这里,

    • x是观察结果

    • W是混合矩阵

    • χ是来源或独立成分

    现在我们必须找到一个非混合矩阵,使成分尽可能独立。而测试成分独立性最常用的方法是非高斯性:

    • 根据中心极限定理(Central Limit Theorem),多个独立随机变量混合之后会趋向于正态分布(高斯分布)。

    • 因此,我们可以寻找所有独立分量中能最大化峰度的分量。

    • 一旦峰度被最大化,整个分布会呈现非高斯分布,我们也能得到独立分量。

    在Python中实现ICA:

      
    1. from sklearn.decomposition import FastICA

    2. ICA = FastICA(n_components=3, random_state=12)

    3. X=ICA.fit_transform(df[feat_cols].values)

    10. IOSMAP

    代码:

      
    1. from sklearn import manifold

    2. trans_data = manifold.Isomap(n_neighbors=5, n_components=3, n_jobs=-1).fit_transform(df[feat_cols][:6000].values)

    使用的参数:

    • n_neighbors:决定每个点的相邻点数

    • n_components:决定流形的坐标数

    • n_jobs = -1:使用所有可用的CPU核心

    可视化:

      
    1. plt.figure(figsize=(12,8))

    2. plt.title('Decomposition using ISOMAP')

    3. plt.scatter(trans_data[:,0], trans_data[:,1])

    4. plt.scatter(trans_data[:,1], trans_data[:,2])

    5. plt.scatter(trans_data[:,2], trans_data[:,0])

    11. t-SNE

    代码:

      
    1. from sklearn.manifold import TSNE

    2. tsne = TSNE(n_components=3, n_iter=300).fit_transform(df[feat_cols][:6000].values)

    可视化:

      
    1. plt.figure(figsize=(12,8))

    2. plt.title('t-SNE components')

    3. plt.scatter(tsne[:,0], tsne[:,1])

    4. plt.scatter(tsne[:,1], tsne[:,2])

    5. plt.scatter(tsne[:,2], tsne[:,0])

    12. UMAP

    代码:

      
    1. import umap

    2. umap_data = umap.UMAP(n_neighbors=5, min_dist=0.3, n_components=3).fit_transform(df[feat_cols][:6000].values)

    这里,

    • n_neighbors:确定相邻点的数量。

    • min_dist:控制允许嵌入的紧密程度,较大的值可确保嵌入点的分布更均匀。

    可视化:

      
    1. plt.figure(figsize=(12,8))

    2. plt.title('Decomposition using UMAP')

    3. plt.scatter(umap_data[:,0], umap_data[:,1])

    4. plt.scatter(umap_data[:,1], umap_data[:,2])

    5. plt.scatter(umap_data[:,2], umap_data[:,0])

    总结

    到目前为止,我们已经介绍了12种降维方法,考虑到篇幅,我们没有仔细介绍后三种方法的原理,感兴趣的读者可以找资料查阅,因为它们中的任何一个都足够写一篇专门介绍的长文。本节会对这12种方法做一个总结,简要介绍它们的优点和缺点。

    • 缺失值比率:如果数据集的缺失值太多,我们可以用这种方法减少变量数。

    • 低方差滤波:这个方法可以从数据集中识别和删除常量变量,方差小的变量对目标变量影响不大,所以可以放心删去。

    • 高相关滤波:具有高相关性的一对变量会增加数据集中的多重共线性,所以用这种方法删去其中一个是有必要的。

    • 随机森林:这是最常用的降维方法之一,它会明确算出数据集中每个特征的重要性。

    • 前向特征选择反向特征消除:这两种方法耗时较久,计算成本也都很高,所以只适用于输入变量较少的数据集。

    • 因子分析:这种方法适合数据集中存在高度相关的变量集的情况。

    • PCA:这是处理线性数据最广泛使用的技术之一。

    • ICA:我们可以用ICA将数据转换为独立的分量,使用更少的分量来描述数据。

    • ISOMAP:适合非线性数据处理。

    • t-SNE:也适合非线性数据处理,相较上一种方法,这种方法的可视化更直接。

    • UMAP:适用于高维数据,与t-SNE相比,这种方法速度更快。

    原文地址:www.analyticsvidhya.com/blog/2018/08/dimensionality-reduction-techniques-python/

    推荐阅读:

    一大批历史精彩文章啦

    展开全文
  • 关于CDN以及如何绕过CDN寻找真实ip

    千次阅读 2021-05-03 22:55:34
    于是,他提出一个学术难题,希望有人能发明一全新的、从根本上解决问题的方法,来实现互联网内容的无拥塞分发。当时Tim Berners-Lee博士的隔壁,是Tom Leighton教授的办公室。他是一位麻省理工学院应用数学教授。...

    目录

    一. CDN产生的背景

    二. CDN的诞生

    三. CDN原理

    四. CDN好处

    五. 检测是否存在CDN

    六. 绕过CDN查找真实ip

    实战分享—寻找真实ip绕过WAF防御机制


    学习一项新的知识,要从它产生的背景开始了解

    一. CDN产生的背景

    如今这个移动互联网时代,越来越多的人使用手机观看视频,丰富自己的娱乐生活。可是,大家在追剧的时候,有没有想过一个问题——为什么有时候明明自己手机的网速很快,但观看视频时,仍然卡顿?回答这个问题之前,我们先来做一道算术题。

    以之前很火的“延禧攻略”为例,当时曾经在某视频APP实现了1千万用户同时在线观看。如果大家观看的是1080p清晰度的视频(理论上需要4Mbps带宽),那么,累计需要的流量带宽是10,000,000×4Mbps=40,000,000Mbps=40Tbps。对于优酷、爱奇艺这样的互联网视频内容提供商来说,这无疑是非常巨大的流量压力。我们普通计算机的网卡,是1Gbps的带宽。如果优酷有一台超级服务器,那么,这台超级服务器就需要4万块网卡,而且必须百分之百跑满速度,才能够实现这1千万用户的流畅观看。对于一些实力不够的服务商,或者突发流量陡增的情况,就会造成拥塞,从而导致卡顿和延时。

    有这么一个说法:当用户打开一个页面,等待超过4秒,他就会关闭这个页面。也就是说,这个用户就会流失。用户的流失,就意味着金钱的流失。没有任何一家互联网服务提供商希望这样的情况发生。所以,它们必须想方设法让自己的内容尽快呈现,缩短用户的等待时间,提升用户的体验。

    CDN,就是一项非常有效的缩短时延的技术。

    二. CDN的诞生

    上世纪80年代,互联网技术刚刚走入民用领域。人们主要通过拨号来访问网络,带宽很低,用户也很少,所以,没有对骨干网以及服务器带来压力。随着互联网的爆炸式发展,用户越来越多,加上宽带接入网的出现,内容源服务器和骨干网络的压力越来越大,无法及时响应用户的访问需求。

    1995年,麻省理工学院教授、互联网的发明者之一,Tim Berners-Lee博士发现,网络拥塞越来越严重,将会成为互联网发展的最大障碍。于是,他提出一个学术难题,希望有人能发明一种全新的、从根本上解决问题的方法,来实现互联网内容的无拥塞分发。当时Tim Berners-Lee博士的隔壁,是Tom Leighton教授的办公室。他是一位麻省理工学院应用数学教授。他被Berners-Lee的挑战激起了兴趣,于是他请研究生Danny C. Lewin和其他几位顶级研究人员一起破解这个技术难题。

    最终,他们开发了利用数学运算法则来处理内容的动态路由算法技术,有效地解决了这个难题。这个技术,就是CDN。他们还为此专门成立了公司,发挥其商业价值。这个公司,就是后来鼎鼎大名的CDN服务鼻祖——Akamai公司

    三. CDN原理

    CDN这个技术其实说起来并不复杂,最初的核心理念,就是将内容缓存在终端用户附近。内容源不是远么?那么,我们就在靠近用户的地方,建一个缓存服务器,把远端的内容,复制一份,放在这里,不就OK了?

    因为这项技术是把内容进行了分发,所以,它的名字就叫做CDN——Content Delivery Network,内容分发网络。具体来说,CDN就是采用更多的缓存服务器(CDN边缘节点),布放在用户访问相对集中的地区或网络中。当用户访问网站时,利用全局负载技术,将用户的访问指向距离最近的缓存服务器上,由缓存服务器响应用户请求。(有点像电商的本地仓吧?)

    大家可能觉得,这个不就是“镜像服务器”嘛?其实不一样。镜像服务器是源内容服务器的完整复制。而CDN,是部分内容的缓存,智能程度更高。

    确切地说,CDN=更智能的镜像+缓存+流量导流

    而且还需要注意的是,CDN并不是只能缓存视频内容,它还可以对网站的静态资源(例如各类型图片、html、css、js等)进行分发,对移动应用APP的静态内容(例如安装包apk文件、APP内的图片视频等)进行分发。

    我们来举个例子,看看CDN的具体工作流程。如果某个用户想要访问优酷的视频点播内容,那么:

    ①、当用户点击APP上的内容,APP会根据URL地址去本地DNS(域名解析系统)寻求IP地址解析。

    ②、本地DNS系统会将域名的解析权交给CDN专用DNS服务器

    ③、CDN专用DNS服务器,将CDN的全局负载均衡设备IP地址返回用户。

    ④、用户向CDN的负载均衡设备发起内容URL访问请求。

    ⑤、CDN负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的缓存服务器

    ⑥、负载均衡设备告诉用户这台缓存服务器的IP地址,让用户向所选择的缓存服务器发起请求。

    ⑦、用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。

    ⑧、如果这台缓存服务器上并没有用户想要的内容,那么这台缓存服务器就要网站的源服务器请求内容。

    ⑨、源服务器返回内容给缓存服务器,缓存服务器发给用户,并根据用户自定义的缓存策略,判断要不要把内容缓存到缓存服务器上。

    四. CDN好处

    采用CDN技术,最大的好处,就是加速了网站的访问——用户与内容之间的物理距离缩短,用户的等待时间也得以缩短。而且,分发至不同线路的缓存服务器,也让跨运营商之间的访问得以加速。例如中国移动手机用户访问中国电信网络的内容源,可以通过在中国移动假设CDN服务器,进行加速。效果是非常明显的。

    此外,CDN还有安全方面的好处。内容进行分发后,源服务器的IP被隐藏,受到攻击的概率会大幅下降。而且,当某个服务器故障时,系统会调用临近的健康服务器,进行服务,避免对用户造成影响。

    正因为CDN的好处很多,所以,目前所有主流的互联网服务提供商,都采用了CDN技术。所有的云服务提供商,也都提供了CDN服务

    cdn的好处很多,但是对于渗透测试人员来说,是成功路上的绊脚石。它将服务器的真实ip隐藏了,访问的数据先到达cdn,相当于我们是直接与cdn进行了交互,比如我们此时进行域名的端口扫描,那扫描的就是cdn的端口!而且现在CDN也能充当云waf的功能,有什么攻击动作云waf先把你干掉了。所以,绕过cdn查找真实ip就挺重要的。

    五. 检测是否存在CDN

    要看一个网站是否开启CDN功能,方法很简单。只要在不同的地区ping网址就可以:例如在旺角ping得到的IP地址是61.10.0.0,但在拉斯维加斯ping得到的IP确是76.164.192.0。像这样在不同地区ping同一个网址,我们得到不同的IP地址,那么这种情况,我们就可以判断该网站开了CDN加速。讲得在通俗易懂就是“就近原则”了。所以我们可以使用在线ping检测,原理也就是通过假设在不同地区的服务器对目标进行发起ping请求,如何ping出来的ip大于或等于两个,则可判断使用了cdn。

    站长直接ping检测

    六. 绕过CDN查找真实ip

    通过ping检测发现使用了CDN后,就需要去查找真实ip了。要知道有很多客户使用CDN的一个很大的目的就是为了隐藏自己的ip,所以想查找真实ip也不是那么容易。网上有很多方法,但基本都是千篇一律,放在过去估计行,但是现在压根就没用,都是互相抄来抄去,估计自己都没验证过。如果网上有人给出了好的找到真实IP的方法,那防止攻击不就起不到作用了。这里列举两个我觉得可能有效的方法:

    1. 利用fafa

    我们首先F12查看目标网站的源代码,找到站点的title。观察网站title是否是标志性的词,就是看起来像不像会重名的那种。 如果title看起来就很特殊,则可以利用fofa来搜索网站的title,语法为title="title" 进行查找。然后搜索出来的ip我们打开进去看站点是否和我们用域名打开的网站一样,如果是则很可能是真实ip。如果fofa搜索出来的ip进入查看后发现和我们目标域名的站点不一样,说明不是真实ip,可能是cdn或者虚拟主机服务器。

    2. 从邮件中获取真实ip

    让网站给你发邮件,打开邮件详情,然后导出为eml格式的文件,寻找 "Received" 关键词,里面存在真实ip地址

     案例——> https://xz.aliyun.com/t/1761

    参考文章:到底什么是CDN? - 知乎小枣君

    实战分享—寻找真实ip绕过WAF防御机制

    ——> 记一次waf绕过实战_北遇-CSDN博客

    展开全文
  • 23 设计模式详解(全23

    万次阅读 多人点赞 2019-06-09 00:21:59
    创建型模式,共五:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一:...
  • Computer:Todesk(远程控制软件)的简介、安装、使用方法之详细攻略 导读:近些年,ToDesk在远程控制软件领域异军突起,作为国产软件,发展迅猛,的确有“两把刷子”。博主近一段时间,通过下载安装,测试了文件...
  • 第六章 互联网方法论 附录 周鸿祎批注“遗失的乔布斯访谈” 我的总结 老周的互联网方法论 思维导图 周鸿祎这个人比较有争议,如果不是他,中国互联网的免费文化可能还不会像今天这样,免费,共享等等概念满天...
  • 所以有些项目管理领域的研究者都认为关键链方法不是一全新的项目管理方法,只是一新的风险管理方法。 传统关键路径方法中,关键路径定义为项目中最长的路径,关键路径上的任何任务延迟,都会导致整个项目的...
  • 25用WordPress博客在网上赚钱的方法

    千次阅读 2020-05-03 09:05:14
    您是否在寻找网上赚钱的最佳途径?[WordPress](http://wordpress.org)是这个星球上最大的发布平台,它占所有网站的36%。你可以使用[WordPress和博客](http://gplwp.eastfu.com)通过做你喜欢的事来赚钱。在这篇文章...
  • 我们搞技术的,有时候说话就是比较直,这个只是从概率上讲哈,包括我在内,有时候说话,需要换个方式方法,可能效果就完全不一样,一直硬怼,最终受伤的还是我们自己。就像10年软硬经验的刘杰说的,技术不等于财富,...
  • KMeans,分层聚类以及客户分群案例

    千次阅读 2019-04-03 23:29:09
    它属于聚类,即属于无监督学习的一应用 客户分群的目的是每一组特征描述丰富详细,不同组间特征差异明显,但组内特征相似 它是一个计算距离的过程,主要是用欧式距离去解决 什么是分群? 将现有消费者群体按一定...
  • 最快引流的10个引流方法

    千次阅读 2020-08-10 11:06:51
    4,应用外连接引流 连接引流是最立即的网站引流方法,可是现阶段很多blog、社区论坛都已不容许立即留外部链接,这就想要你不断寻找能够 留外部链接的服务平台,在服务平台上公布高品质的文章内容,进而获得友链或高...
  • 静态内容实现缓存的七不同方法

    千次阅读 2017-04-27 18:13:04
    在商业世界中,人们常说“现金为王”。然而,在技术世界里,我们却说“缓存为王”。 从浏览器到应用前端、应用后端、数据库,每一层都可以通过缓存来显著地...本文主要讨论静态内容实现缓存的七不同方法。 1. 利用
  • 聚类分析方法的研究与应用综述

    千次阅读 2020-12-04 18:23:43
    是研究(样品或指标)分类问题的一统计分析方法,是数据挖掘的一个重要算法。聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都有相似的一些属性。...
  • 改善C#程序的50种方法

    万次阅读 2016-06-01 15:46:42
    毕竟,属性是对访问/修改内部数据的方法的一扩展 。 我们知道,属性访问器在编译后事实上是两个分离的方法。 在 C# 2.0 中,我们可以为一个属性的 get 访问器和 set 访问器指定不同的访问修饰符 。这使得我们...
  • 《世界500强公司要求员工必须熟练掌握的七工作方法,收好不谢!》 精选一 工作讲究方法,找到了好方法可以让你的工作事半功倍,而没有头绪、没有计划、没有目标的工作形式则会让你身心俱疲还毫无成效。一流公司...
  • 微信公众号推广的40个有效果的方法

    千次阅读 2020-08-28 09:44:54
    阿酷TONY整理自网络 2020-8-28 时下,微信公众平台已成为热门的营销推广平台,大家都对微信非常重视,有的礼品企业甚至推出...阿酷TONY整理了40个最有效的方法,供大家参考。 1、微信好友推荐 虽然是微博上的玩..
  • AI科技评论发现了一个GitHub项目,上面展示了GPT-3的多种玩法,整整50,包括用GPT-3生成网页、图表、代码、文本以及推理。其中令人吃惊的是,GPT-3能生成Keras编写的卷积神经网络的代码,还能应对程序员面试、回复...
  • Java常见设计模式总结

    万次阅读 多人点赞 2021-09-18 17:18:54
    设计模式是一套经过反复使用的代码设计经验,目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式于己于人于系统都...总体来说,设计模式分为三大类:5创建型模式、7结构型模式、11行为型模式
  • 我们选取的数据时1994年德国的一家银行在平定客户信用风险好坏的时候用到的一组变量,共有1000组数据。由于年代久远可能和实际有些出入。数据可以在下面的网址下载。
  • MySQL数据库优化的八方式(经典必看)

    万次阅读 多人点赞 2019-03-13 15:48:28
    MySQL数据库优化的八方式(经典必看) 引言: 关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿...
  • 等多方面,介绍三可以找回比特币钱包私钥的方法, 暴力破解 钱包找回服务公司(Wallet Recovery Services),这是一家线上公司,可以 恢复密码和修复损坏的加密货币钱包 。该公司的四名匿名员工使用假名Dave ...
  • 以上三基本上就是当前最常见的缺失值处理方式,不过,大家也从未忘记寻找更好的处理方式,《基于机器学习数据缺失值填补》就提出了新的方法,顾名思义,采用了机器学习的方法,譬如神经网络模型,来填补缺失值。...
  • 货币的一互联网体系架构

    万次阅读 2019-05-18 08:17:33
    9,10和11小节分别介绍了寻找的目标,协议一节程序层。 14小节展示了重要的观察和开发问题。 参考文献在15小节,作者详细情况在16小节。 最后,便签颜色编码(本文是翻译文,不参照下述): 深蓝色粗体 ...
  • 实战 | 电信客户流失分析与预测

    万次阅读 多人点赞 2020-03-01 12:29:00
    本文所有代码都通过运行!将从以下方面进行分析:1.背景 2.提出问题 3.理解数据 4.数据清洗 5.可视化分析 6.用户流失预测 7.结论和建议本项目带你根据以上过程详细分析电信客户数...
  • 4JavaScript的内存泄露及避免方法

    万次阅读 多人点赞 2017-06-08 15:31:54
    这篇文章里面我们会讨论客户侧javascript代码中的常见种类的内存泄漏。也会学习如何用Chrome Development Tools来定位这些问题。继续阅读吧! 介绍 内存泄漏是每个开发者最终必须面对的问题。即使使用有内存...
  • 软件工程 实践者的研究方法 中文题答案

    千次阅读 多人点赞 2021-01-27 23:26:33
    19.1用自己的话,描述为什么在面向对象系统中,类是最小的合理测试单元。 答:在面向对象软件中,单元的概念发生...19.8运用随机测试、划分方法、多类测试及19.5, 19.6节所描述的银行应用的行为模型导 出的测试,在另
  • 第3章 如何赢得客户

    千次阅读 2015-03-03 16:18:00
    3.1客户的三角色:购买者、使用者和影响者 客户(或消费者)是一泛称,可细分为“购买者”、“使用者”和“影响者”三角色。人们可以通过上下文语义来判断当前所说的客户究竟是什么角色。  如果购买...
  • 20提升页面加载速度的方法

    千次阅读 2017-07-23 00:19:41
    20提升网页加载速度的方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,863
精华内容 19,545
关键字:

寻找客户的12种方法