读《面向程序员的数据挖掘指南》读书笔记

该书推荐的资源:Tom Mitchell《机器学习》

该书最大的特点:实用性很强。

该书最大的缺点是:用嵌套字典来表达复杂的距离关系,显得力不从心,如果用矩阵和向量将会省事很多。

该书最大的优点是:通俗易懂,逻辑性强,考虑问题逐步深入!体会很深!是一本很好的参考书。

1.      如何找到相似用户:

曼哈顿距离:计算速度快.

皮尔逊系数:很好地解决大家起点分不一致问题。解决“分数膨胀”问题。很好地利用去均值后,再进行计算。

欧几里得距离

N维模型为矩阵表示做好基础.

闵可夫斯基距离

使用Python代码来表示推荐数据,用字典,在预处理时,比较复杂.当然,矩阵表示也要处理成规范格式。

余弦相似度也是一种距离吧,相似距离吧。解决数据稀疏问题。

余弦相似度的范围从1到-1,1表示完全匹配,-1表示完全相悖。

最后给出结论:

(1)如果数据存在“分数膨胀”问题,就使用皮尔逊相关系数。

(2)如果数据比较“密集”,变量之间基本都存在公有值(相差为0),且这些距离数据是非常重要的,那就使用欧几里得或曼哈顿距离。

(3)如果数据是稀疏的,则使用余弦相似度。

(4)曼哈顿距离和欧几里得距离在数据完整的情况下会运作得非常好,如果数据比较稀疏,则要考虑使用余弦距离。

 实际还存在的一个问题:

就在于我们只依靠最相似的 一个 用户来做推荐,如果这个用户有些特殊的偏好,就会直接反映在推荐内容里。解决方法之一是找寻多个相似的用户,这里就要用到K最邻近算法了。

 显式评价:就是用户直接给产品或者服务对象打分,分值在0-5之间。

隐式评价:就是我们不让用户明确给出对物品的评价,而是通过观察他们的行为来获得偏好信息。示例之一就是记录用户在纽约时报网上的点击记录。

通过观察之后,就可以为用户刻画了一个合理的模型。用这些信息来做出看过还看过的推荐。

另一种隐式评价是用户的实际购买记录,用这些记录来进行买过还买过,以及看过次商品的用户还买过的推荐。

显式评价的问题:

(1)               人们很懒,不愿评价物品。

用户很可能不会对物品做出评价。

(2)               人们会撒谎,或存在偏见。

用户可能给出不正确的评价或是不置可否,抱有偏见。

人们不会及时更新他们的评论。

所以,还要看评价的时间哦。

    隐式评价存在问题:

    我给别人买东西,但购物记录无法区分开来。

         我们可以收集到哪些隐式评价呢? 网页方面:页面点击、停留时间、重复访问次数、引用率、Hulu上观看视频的次数;音乐播放器:播放的曲目、跳过的曲目、播放次数;这些只是一小部分!

假设你有一百万个用户,每次推荐需要计算一百万个距离数据。如果我们想在一秒钟里进行多次推荐,那计算量将是巨大的。除非增加服务器的数量,否则系统会变得越来越慢。说得专业一点,通过邻域进行计算的推荐系统,延迟会变得越来越严重。

还好,这是有解决办法的。

基于用户的协同过滤存在两个严重问题:

1. 扩展性上文已经提到,随着用户数量的增加,其计算量也会增加。这种算法在只有几千个用户的情况下能够工作得很好,但达到一百万个用户时就会出现瓶颈。

2. 稀疏性大多数推荐系统中,物品的数量要远大于用户的数量,因此用户仅仅对一小部分物品进行了评价,这就造成了数据的稀疏性。比如亚马逊有上百万本书,但用户只评论了很少一部分,于是就很难找到两个相似的用户了。

鉴于以上两个局限性,我们不妨考察一下基于物品的协同过滤算法。

需要注意这两种算法的区别:基于用户的协同过滤是通过计算用户之间的距离找出最相似的用户,并将他评价过的物品推荐给目标用户;而基于物品的协同过滤则是找出最相似的物品,再结合用户的评价来给出推荐结果。

这时,矩阵一行一个用户的评价,一列一个物品。利用同时都对该商品评价过的。在基于用户的算法中,我们计算的是行与行之间的相似度,而在基于物品的算法中,我们计算的是列与列之间的。

基于用户的协同过滤又称为内存型协同过滤,因为我们需要将所有的评价数据都保存在内存中来进行推荐。

基于物品的协同过滤也称为基于模型的协同过滤,因为我们不需要保存所有的评价数据,而是通过构建一个物品相似度模型来做推荐。只要抽取出商品的那列即可。

def computeSimilarity(band1, band2, userRatings):

averages = { }

for (key,ratings) in userRatings.items():

averages[key] = (float(sum(ratings.values())) / len(ratings.values()))

num = 0 # 分子

dem1 = 0 # 分母的第一部分

dem2 = 0

for (user,ratings) in userRatings.items():

if band1 in ratings and band2 in ratings:

avg = averages[user]

num += (ratings[band1] - avg) * (ratings[band2] - avg)

dem1 += (ratings[band1] - avg) ** 2

dem2 += (ratings[band2] - avg) ** 2

return num / (sqrt(dem1) * sqrt(dem2))

 怎么预测呢。利用公式,其大意是,用户U对某个物品i要预测,只要将用户对相似物品打的分乘以,物品相似度作为权值求和,之后除以相似度总和值,这样就能得到要预测的物品的评价分。当然最好公式的相似度能表现在(-1,1)之间吧。

这样,我们就可以来回进行转换了。

有了这个基础后,下面就让我们看看如何求解上文中的p(David, Kacey Musgraves)。

首先我们要修正David对各个物品的评分:

变换后为:

接着,计算:

回顾:

(1)        修正的余弦相似度是一种基于模型的协同过滤算法。这种算法的优势之一是扩展性好,对于大数据量而言,运算速度快,占用内存少。

(2)        用户的评价标准是不同的。修正的余弦相似度计算时会将用户对物品的评分减去用户所有评分的均值,从而解决这个问题。

 Slope one算法:

你可以将Slope One分为两个步骤:

(1)第一步:计算差值。计算出两两物品之间的差值(可以在夜间批量计算)。在上文的例子中,这个步骤就是得出Whitney Houston要比PSY高一分。

(2)第二步则是进行预测,比如一个新用户Ben来到了我们网站,他从未听过Whitney Houston的歌曲,我们想要预测他是否喜欢这位歌手。通过利用他评价过的歌手以及我们计算好的歌手之间的评分差值,就可以进行预测了。

我们来考察PSY和Taylor Swift之间的差值,card(S (X))的值是2——因为有两个用户(Amy和Ben)同时对PSY和Taylor Swift打过分。

 如果新用户进入怎么办??是不是都要重新计算一遍呢。

如果新用户进入,我们只需记录同时评价过这对物品的用户数就可以了。只需要计算总差值+新的差值除以现在的总用户数,这样更新新的差值。

这样,差值矩阵只需要更新两个值(对称矩阵缘故)。

第二步:使用加权的SlopeOne算法进行预测。

表示遍历Ben评价过的所有歌手,除了WhitneyHouston以外(也就是-{j}的意思)。

整个分子的意思是:对于Ben评价过的所有歌手(Whitney Houston除外),找出Whitney

Houston和这些歌手之间的差值,并将差值加上Ben对这个歌手的评分。

同时,我们要将这个结果乘以同时评价过两位歌手的用户数。

有一个问题:

我的笔记本电脑有8G内存,在尝试用SlopeOne计算图书漂流站数据集时报内存溢出了。那个数据集中有27万本书,因此需要保存超过7300万条记录的Python字典。

这个字典的数据是否很稀疏呢?修改算法,让它能够处理更多数据吧。

解决的方法一:将字典存储变为矩阵存储。

解决的方法二:用稀疏矩阵来存储,实际上就是第一个存行,第二个存列,第三个存差异值和频率,第一个差异值的前者是我们打算要评价的,第二个是我们已知物品评价分,目的就是利用之间的差值,且使用都评价用户的个数。

 

 

 

 

 

 

 

 

 

 

 

 

如何使用协同过滤来进行推荐,由于使用的是用户产生的各种数据,因此,又称为社会化过滤算法。

协同过滤算法倾向于推荐那些已经很流行的物品。

试想一个极端的例子:一个新乐队发布了专辑,这张专辑还没有被任何用户评价或购买过,那它将永远不会出现在推荐列表中。

这类推荐系统会让流行的物品更为流行,冷门的物品更无人问津。

“根据你目前告知的信息,我们播放的这首歌曲有着相似的旋律,使用了声响和电音的组合,即兴的吉他伴奏。”

事实上,评分标准不一是所有推荐系统的大敌!

标准化:不用担心,我们可以使用标准化。

要让数据变得可用我们可以对其进行标准化,最常用的方法是将所有数据都转化为0到1之间的值。

 

拿上面的薪酬数据举例,最大值115,000和最小值43,000相差72,000,要让所有值落到01之间,可以将每个值减去最小值,并除以范围(72,000)。

最大值为1,最小值为0,这样就在0-1之间了。

 

比如说标准分(z-score)——分值偏离均值的程度:

标准差的计算公式是:

计算方法为:

 

标准分带来的问题:

标准分的问题在于它会受异常值的影响。

比如说一家公司有100名员工,普通员工每小时赚10美元,而CEO一年能赚600万,那全公司的平均时薪为:38美元/小时。

 

修正的标准分

计算方法:将标准分公式中的均值改为中位数,将标准差改为绝对偏差。

以下是绝对偏差的计算公式:

中位数指的是将所有数据进行排序,取中间的那个值。如果数据量是偶数,则取中间两个数值的均值。

下面就让我们试试吧。

首先将所有人按薪水排序,找到中位数,然后计算绝对偏差:

当物品的特征数值尺度不一时,就有必要进行标准化。

比如上文中音乐特征里大部分是1到5分,鼓点数却是60到180;交友网站中薪水和年龄这两个尺度也有很大差别。

需要进行标准化的情形:

1. 我们需要通过物品特性来计算距离;

2. 不同特性之间的尺度相差很大。

在潘多拉的例子中,如果所有的音乐特征都是在1到5分之间浮动的,是否还需要标准化呢?虽然即使做了也不会影响计算结果,但是任何运算都是有性能消耗的,这时我们可以通过比较两种方式的性能和效果来做进一步选择。

最明显的方式是找到问号歌曲最邻近的歌曲,因为它们之间相似度比较高,再根据用户是否喜欢这些邻近歌曲来判断他对问号歌曲的喜好。

items = {"Dr Dog/Fate": [2.5, 4, 3.5, 3, 5, 4, 1],

"Phoenix/Lisztomania": [2, 5, 5, 3, 2, 1, 1],

"Heartless Bastards/Out": [1, 5, 4, 2, 4, 1, 1],

"Todd Snider/Don't Tempt Me": [4, 5, 4, 4, 1, 5, 1],

"The Black Keys/Magic Potion": [1, 4, 5, 3.5, 5, 1, 1],

"Glee Cast/Jessie's Girl": [1, 5, 3.5, 3, 4, 5, 1],

"La Roux/Bulletproof": [5, 5, 4, 2, 1, 1, 1],

"Mike Posner": [2.5, 4, 4, 1, 1, 1, 1],

"Black Eyed Peas/Rock That Body": [2, 5, 5, 1, 2, 2, 4],

"Lady Gaga/Alejandro": [1, 5, 3, 2, 1, 2, 1]}

 

 

 

这就是巨大的进步啊!!!!

终于见到向量和矩阵了!

 

 

推特情感分类

很多人在对推特中的文字消息进行情感分类(积极的、消极的),可以有很多用途,如Axe发布了一款新的腋下除臭剂,通过推文就能知道用户是否满意。这里用到的物品特征是      文字信息。

人脸识别

现在有些手机应用可以识别出照片里你的朋友们,这项技术也可用于监控录像中的人脸识别。不同的识别技术细节可能不同,但都会用到诸如五官的大小和相对距离等信息。

政治拉票

通过将目标选民分为“爱凑热闹”、“很有主见”、“家庭为重”等类型,来进行有针对性的拉票活动。

市场细分

这和上个例子有点像,与其花费巨额广告费向不可能购买维加斯公寓的人进行宣传,不如从人群中识别出潜在客户,缩小宣传范围。最好能再对目标群体进行细分,进一步定制广告内容。

个人健康助理

如今人们越来越关注自身,我们可以购买到像Nike健身手环这样的产品,而Intel等公司也在研制一种智能家居,可以在你行走时称出你的重量,记录你的行动轨迹,并给出健康提示。

有些专家还预言未来我们会穿戴各种便携式设备,收集我们的生活信息,并加以分类。

其他方面:

识别恐怖分子

来信分类(重要的、一般的、垃圾邮件)

预测医疗费用

识别金融诈骗

 

[('Gymnastics',[54, 66], ['Asuka Termoto']),

('Basketball',[72, 162], ['Brittainey Raven']), ...]

 

这是我最认同的表示方式,因为它将不同类型的数据区别开来了,依次是分类、特征、备注。这里备注可能有多个,所以也用了一个列表来表示。

def unitTest():

list1 = [54, 72, 78, 49, 65, 63, 75, 67, 54]

classifier = Classifier('athletesTrainingSet.txt')

m1 = classifier.getMedian(list1)

assert(round(m1, 3) == 65)

...

print("getMedian和getAbsoluteStandardDeviation均能正常工作")

 

断言在单元测试中是很常用的。

将大型代码拆分成一个个小的部分,并为每个部分编写单元测试,这一点是很重要的。如果没有单元测试,你将无法知道自己是否正确完成了所有任务,以及未来的某个修改是否会导致你的程序不可用。--- Peter Norvig

记住所有的学习过程都是在你自己的脑中进行的,你付出的努力越多,学到的也就越多。

我们将这些数据集分为了两个部分,第一部分用来构造分类器,因此称为训练集;另一部分

用来评估分类器的结果,因此称为测试集。

训练集和测试集在数据挖掘中很常用。

数据挖掘工程师不会用同一个数据集去训练和测试程序。

因为如果使用训练集去测试分类器,得到的结果肯定是百分之百准确的。

将数据集拆分成一大一小两个部分的做法就产生了,前者用来训练,后者用来测试。不过,

这种做法似乎也有问题:如果分割的时候不凑巧,就会引发异常。

解决方法之一是将数据集按不同的方式拆分,测试多次,取结果的平均值。比如,我们将数

据集拆为均等的两份:我们可以先用第一部分做训练集,第二部分做测试集,然后再反过来,取两次测试的平均结

果。我们还可以将数据集分成三份,用两个部分来做训练集,一个部分来做测试集,迭代三

次:

1. 使用Part 1和Part 2训练,使用Part 3测试;

2. 使用Part 1和Part 3训练,使用Part 2测试;

3. 使用Part 2和Part 3训练,使用Part 1测试;

最后取三次测试的平均结果。

在数据挖掘中,通常的做法是将数据集拆分成十份,并按上述方式进行迭代测试。因此这种

方式也称为——

十折交叉验证将数据集随机分割成十个等份,每次用9份数据做训练集,1份数据做测试集,如此迭代10次。

我们来看一个示例:假设我有一个分类器能判断某个人是否是篮球运动员。我的数据集包含

500个运动员和500个普通人。

第一步:将数据分成10份。

第二步:重复以下步骤10次

1. 每次迭代我们保留一个桶,比如第一次迭代保留木桶1,第二次保留木桶2。

2. 我们使用剩余的9个桶来训练分类器,比如第一次迭代使用木桶2至10来训练。

3. 我们用刚才保留的一个桶来进行测试,并记录结果。

第三步:合并结果

我们可以用一张表格来展示结果,观察总共训练情况。

通过十折交叉验证得到的评价结果肯定会比二折或者三折来得准确,毕竟我们使用了90%的

数据进行训练,而非二折验证中的50%。

留一法

在数据挖掘领域,N折交叉验证又称为留一法。

上面已经提到了留一法的优点之一:我们用几乎所有的数据进行训练,然后用一个数据进行

测试。

留一法的另一个优点是:确定性。

什么是确定性?

试想Lucy花了一整周的时间编写了一个分类器。周五的时候她请两位同事(Emily和Li)来对这个分类器进行测试,并给了他们相同的数据集。

这两位同事都使用十折交叉验证,结果是:

为什么她们的结果不一样?是某个人计算发生错误了吗?其实不是。

在十折交叉验证中,我们需要将数据随机等分成十份,因此Emily和Li的分法很有可能是不一样的。这样一来,她们的训练集和测试集也都不相同了,得到的结果自然不同。

即使是同一个人进行检验,如果两次使用了不同的分法,得到的结果也会有差异。

因此,十折交叉验证是一种不确定的验证。相反,留一法得到的结果总是相同的,这是它的一个优点。

留一法的缺点:最大的缺点是计算时间很长。

假设我们有一个包含1000条记录的数据集,使用十折交叉验证需要运行10分钟,而使用留一法则需要16个小时。如果我们的数据集更大,达到百万级,那检验的时间就更长了。

这样一来,没有一个桶能真正代表这个数据集的全貌。最好的方法是将不同类别的运动员按比例分发到各个桶中,这样每个桶都会包含三分之一篮球运动员、三分之一体操运动员、以及三分之一田径运动员。

这种做法叫做分层。而在留一法中,所有的测试集都只包含一个数据。所以说,留一法对小数据集是合适的,但大多数情况下我们会选择十折交叉验证。

目前我们衡量分类器准确率的方式是使用以下公式:正确分类的记录数÷记录总数。

怎样,是不是觉得混淆矩阵其实并不混淆呢?

解决方案:

我们需要进行以下几步:

修改初始化方法,只读取九个桶中的数据作为训练集;

增加一个方法,从第十个桶中读取测试集;

执行十折交叉验证。

Kappa指标。

有一种分类器叫“机械记忆分类器(Rote Classifer)”,它会将数据集完整地保存下来,并用来判断某条记录是否存在于数据集中。

kNN算法

优化方法之一是考察这条新记录周围距离最近的k条记录,而不是只看一条,因此这种方法称为k近邻算法(kNN)。

每个近邻都有投票权,程序会将新记录判定为得票数最多的分类。比如说,我们使用三个近邻(k = 3),其中两条记录属于体操,一条记录属于马拉松,那我们会判定x为体操。

因此,我们在判定一条记录的具体分类时可以用这种投票的方法。如果两个分类的票数相等,就随机选取一个。

但对于需要预测具体数值的情形,比如一个人对Funky Meters乐队的评分,我们可以计算k个近邻的距离加权平均值。

在计算平均值的时候,我希望距离越近的用户影响越大,因此可以对距离取倒数,从而得到下表:

在分类效果上,究竟是数据量的多少比较重要(即使用pimaSmall和pima数据集的效果),还

是更好的算法比较重要(k=1和k=3)?

解答

以下是比较结果:

看来增加数据量要比使用更好的算法带来的效果好。

他说实验证明增加数据所带来的效果要比改进算法来得大。

事实上,如果仍沿用老的词性分类算法,而仅仅增加训练集的数据量,效果很有可能比他现有的算法更好。当然,他不可能通过收集更多的数据来获得一个博士学位,但如果如果你的算法能够取得哪怕一点点改进,也足够了。

当然,这并不是说你就不需要挑选出更好的算法了,我们之前也看到了好的算法所带来的效果也是惊人的。

但是如果你只是想解决一个问题,而非发表一篇论文,那增加数据量会更经济一些。

所以,在认同数据量多寡的重要影响后,我们仍将继续学习各种算法。

人们使用kNN算法来做以下事情:

在亚马逊上推荐商品

评估用户的信用

通过图像分析来分类路虎车型

人像识别

分析照片中人物的性别

推荐网页

推荐旅游套餐

 

 

 

 

使用近邻算法时,我们很难对分类结果的置信度进行量化。但如果使用的是基于概率的分类算法——贝叶斯算法——那就可以给出分类结果的可能性了:这名运动员有80%的几率是篮球运动员;这位病人有40%的几率患有糖尿病;拉斯克鲁塞斯24小时内有雨的概率是10%。

近邻算法又称为被动学习算法。这种算法只是将训练集的数据保存起来,在收到测试数据时才会进行计算。如果我们有10万首音乐,那每进行一次分类,都需要遍历这10万条记录才行。

贝叶斯算法则是一种主动学习算法。它会根据训练集构建起一个模型,并用这个模型来对新的记录进行分类,因此速度会快很多。

所以说,贝叶斯算法的两个优点即:能够给出分类结果的置信度;以及它是一种主动学习算法。

术语:

P(h)表示事件h发生的概率,称为h的先验概率。在我们进行任何计算之前就已经得知人们使用Mac的概率是0.6。计算之后我们可能会得知使用Mac的人同时会使用iPhone。

P(h|d)称为后验概率,表示在观察了数据集d之后,h事件发生的概率是多少。比如说,我们在观察了使用iPhone的用户后可以得出他们使用Mac的概率是多少。后验概率又称为条件概率。

在构建一个贝叶斯分类器前,我们还需要两个概率:P(D)和P(D|h),请看下面的示例。

你听说过微软的智能购物车吗?没错,他们真有这样的产品。这个产品是微软和一个名为

Chaotic Moon的公司合作开发的。

这家公司的标语是“我们比你聪明,我们比你有创造力。”你可以会觉得这样的标语有些狂妄自大,这里暂且不谈。

在计算出以上这些概率后,选取最大的结果,就能用作分类了。这种方法叫最大后验估计。

我们可以用以下公式来表示最大后验估计:

H表示所有的事件,所以h∈H表示“对于集合中的每一个事件”。整个公式的含义就是:对于集

合中的每一个事件,计算出P(h|D)的值,并取最大的结果。

贝叶斯算法则是一种主动学习算法。它会根据训练集构建起一个模型,并用这个模型来对新的记录进行分类,因此速度会快很多。

这些产品通过网络平台销售,所以iHealth雇佣我们开发一套推荐系统。我通过让购买的用户

填写调查问卷来收集数据,每个问题都对应一个特征。

比如,我们会问客户为什么要开始运动,有三个选项:健康(health)、外表(appearance)、两者皆是(both);我们会问他目前的运动水平:很少运动(sedentary)、一般(moderate)、经常运动(active);我们会问他对健身的热情是高(aggressive)还是一般(moderate);最后,我们会问他是否适应使用高科技产品。

已知一位客户的运动目的是健康、当前水平是中等、热情一般、能适应高科技产品,请用朴

素贝叶斯来推荐手环型号。

我们需要计算以下两个概率,并选取较大的结果:

P(i100|健康,中等水平、热情一般,适应)

P(i500|健康,中等水平,热情一般,适应)

我们先来看第一个概率:

P(i100|健康,中等水平、热情一般,适应) = P(健康|i100)P(中等水平|i100)P(热情一般|i100)P(适应|i100)。

P(健康|i100) = 1/6

P(中等水平|i100) = 1/6

P(热情一般|i100) = 5/6

P(适应|i100) = 2/6

P(i100) = 6/15

因此:

P(i100|满足条件) = 0.167 * 0.167 * 0.833 * 0.333 * 0.4 = 0.00309

再计算另一个模型的概率:

P(i500|满足条件) = P(健康|i500)P(中等水平|i500)P(热情一般|i500)P(适应|i500)

= 4/9 * 3/9 * 3/9 * 6/9 * 9/15

= 0.444 * 0.333 * 0.333 * 0.667 * 0.6

= 0.01975

比如说,我们需要对所有人都做血液测试,才能得到健康人返回阴性结果的真实概率。显然,对全量数据做统计是不现实的,所以我们会选取一个样本,如1000人,对他们进行测试并计算概率。

大部分情况下,这种估计都是接近于真实概率的。但当真实概率非常小时,这种抽样统计的做法就会有问题了。

比如说,民主党对网络非法传播法案的否决率是0.03,即P(S=no|民主党) = 0.03。如果我们分别选取十个民主党和共和党人,看他们对该法案的投票情况,你觉得得到的概率会是什么?答案很可能是0。

从上一节的例子中也看到了,在朴素贝叶斯中,概率为0的影响是很大的,甚至会不顾其他概率的大小。此外,抽样统计的另一个问题是会低估真实概率。

m是一个常数,表示等效样本大小。决定常数m的方法有很多,我们这里使用值的类别来作为m,比如投票有赞成和否决两种类别,所以m就为2。p则是相应的先验概率,比如说赞成和否决的概率分别是0.5,那p就是0.5。

一般也可以用P(X|y)=(nC+1)/(n+m)

一点说明

在这个例子中,所有公式里的m都是2,但这并不表示其他数据集也是这样。比如我们之前做的健康手环问卷调查,运动目的有三个选项,是否适应高科技则有两个选项,所以在计算运动目的概率时m=3、p=1/3,代入公式即:

数值型数据:

第一种方法;

我们可以划定几个范围作为分类,如:

年龄

< 18

18 - 22

23 - 30

31 - 40

40

年薪

$200,000

150,000 - 200,000

100,000 - 150,000

60,000 - 100,000

40,000 - 60,000

划分类别后,进行可以应用朴素贝叶斯方法了。

         第二种方法:

         方法二:高斯分布

我想将收入数据进行分类,然后应用朴素贝叶斯算法。

你的做法已经过时了,我会使用高斯分布和概率密度函数来做。

下面我们将学习如何:

在朴素贝叶斯算法中使用高斯分布。

首先,我们为健康手环的例子增加一列收入属性:

每次出现这些公式时我都想提醒读者千万不要紧张,其实他们只是看起来比较复杂,只

需一步一步拆解开就能理解了。数据挖掘学到后面会遇到各种复杂的公式,千万不要被

他们的外表吓到。

我们需要一个数据结构来存储平均值和样本标准差。

因此在这个例子中,朴素贝叶斯的效果要比近邻算法好。

贝叶斯方法的优点:

实现简单(只需计数即可),需要的训练集较少,运算效率高。

贝叶斯方法的主要缺点是无法学习特征之间的相互影响。比如我喜欢奶酪,也喜欢米饭,但是不喜欢两者一起吃。

在现实数据挖掘场景中,这种特征变量之间不独立的情况还是很多的。

(1)运动员例子中,身高和体重不是互相独立的,因为高的人体重也会较高。

(2)地区邮编、收入、年龄,这些特征也不完全独立,一些地区的房屋都很昂贵,一些地区则只有房车:加州帕罗奥图大多是20岁的年轻人,而亚利桑那州则多是退休人员。在音乐基因工程中,很多特征也是不独立的,如果音乐中有很多变音吉他,那小提琴的概率就降低了。

(3)血液检验的结果中,T4和TSH这两个指标通常是呈反比的。

(4)再从你身边找找例子,比如你的车,它的各种特征之间有相关性吗?一部电影呢?亚马逊上的购买记录又如何?

(5)所以,在使用贝叶斯方法时,我们需要互相独立的特征,但现实生活中很难找到这样的应用,因此我们只能假设他们是独立的了!我们完全忽略了这个问题,因此才称为“朴素的”(天真的)贝叶斯方法。不过事实证明朴素贝叶斯的效果还是很不错的。

把不要的东西丢掉!

比如我们要对下面这篇新闻做分类:

如果我们将英语中最常用的200个单词剔除掉,这篇新闻就成了这样:

因此在定制停词表时还是需要做些考虑的。比如要判别阿拉伯语文档是在哪个地区书写的,可以只看文章中最常出现的词(和上面的方式相反)。如果你有兴趣,可以到我的个人网站上看看这篇论文。

而在分析聊天记录时,强奸犯会使用更多I、me、you这样的词汇,如果在分析前将这些单词去除了,效果就会变差。

情感分析的例子之一是判断一篇评论是正面的还是反面的,我们可以用朴素贝叶斯算法来实现。

我们可以用Pang&Lee 2004的影评数据来测试,这份数据集包含1000个正面和1000个负面的评价,以下是一些示例:

本月第二部连环杀人犯电影实在太糟糕了!虽然开头的故事情节和场景布置还可以,但

后面就……

当我听说罗密欧与朱丽叶又出了一部改编电影后,心想莎士比亚的经典又要被糟蹋了。

不过我错了,Baz Luhrman导演的水平还是高的……

 这个过程叫做聚类:通过物品特征来计算距离,并自动分类到不同的群集或组中。有两种聚

类算法比较常用:

k-means聚类算法

我们会事先告诉这个算法要将数据分成几个组,比如“请把这1000个人分成5个组”,“将这些网页分成15个组”。这种方法就叫k-means。

层次聚类法

对于层次聚类法,我们不需要预先指定分类的数量,这个算方法会将每条数据都当作是一个分类,每次迭代的时候合并距离最近的两个分类,直到剩下一个分类为止。

因此聚类的结果是:顶层有一个大分类,这个分类下有两个子分类,每个子分类下又有两个子分类,依此类推,层次聚类也因此得命。

在计算距离前我们是不是忘了做件事?

标准化!我们先将这些数据转换为修正的标准分。

我们看看Python中如何使用优先队列:

>>> from Queue importPriorityQueue # 加载优先队列类

>>> singersQueue =PriorityQueue() # 创建对象

>>> singersQueue.put((16,'Suzuka Nakamoto')) # 插入元素

>>> singersQueue.put((15, 'MoaKikuchi'))

>>> singersQueue.put((14, 'YuiMizuno'))

>>> singersQueue.put((17, 'AyakaSasaki'))

>>> singersQueue.get() # 获取第一个元素,即最年轻的歌手Yui。

(14, 'Yui Mizuno')

>>> singersQueue.get()

(15, 'Moa Kikuchi')

>>> singersQueue.get()

(16, 'Suzuka Nakamoto')

>>> singersQueue.get()

(17, 'Ayaka Sasaki')

猜你喜欢

转载自blog.csdn.net/weixin_42039090/article/details/80719798
今日推荐