ch4_2
归一化以后的标准分问题
标准分的问题是它很容易受到离群值的影响。比如,如果LargeMart的所有100名员工都是每小时10美元的工资,但是CEO一年能有600万的收入,那么平均每小时的工资是:
( 100 * $10 + 6,000,000 / (40 * 52)) / 101
= (1000 + 2885) / 101
= $38/hr.
在LargeMart来说是个不错的平均工资。正如你所看到的,平均值受到离群值的影响非常大。正因为如此,所以标准分的公式通常都会被修改。
修改过的标准分
首先,在上面公式里面的平均数被中值所代替。标准差也被绝对标准差所代替。
其中μ 即为中值。
继续用我们上面的例子,中值是46,绝对标准差是8.18.
修改过的标准分是:
你来试试
试一试吧。为下面的数据计算传统标准分和修正过的标准分。.
该不该规格化呢?
当不同维度的变量变化很显著时,归一化是最合理的。我已经在上面给出了一些例子。如果我们的变量是年龄,收入,大学的平均绩点,收入将会主宰着距离函数。这样的情况下,我们应该规格化数据。在另一种极端情况下,针对Digg上的新闻用户只要给出好评和差评。那么一个二进制值组成的向量来代表用户评价(1=好评,0=差评):
Bill = {0, 0, 0, 1, 1, 1, 1, 0, 1, 0 …
显然这里就没必要正规化数据了。
那么潘多拉的例子呢:所有的变量在1到5的规模。我们需不需要归一化呢?如果我们归一化的话好像不会影响到算法的准确性,但是别忘了,进行归一化需要话费计算代价的。这样看来,我们要有经验地比较这两个方法得出的结果并选择性能最好的。
回到潘多拉
在潘多拉这个例子中,我们用一些属性来代表每一首歌。如果一个用户创建了一个Green Day的无线电台,我们将基于最近邻居方法来决定播放什么样的歌曲。潘多拉的评价体制是好评和差评。我们假设一个用户给一首歌曲评了差评,我们如何来运用这个信息呢?
假设我用2个属性来表示歌曲:脏吉他部分和快速节拍的出现,这两个属性都是1到5的值域。一个用户给他很喜欢的5首歌曲评了好评(下图用“L”表示);给他不喜欢的5首歌曲评了差评(下图用“D”表示)。
你认为该用户会喜欢图中用星号表示的歌曲吗?
我猜你会说他喜欢这首歌的。我们的根据是星星在图中离L群更近一些,我们在这章剩下的部分来讨论计算方法。最明显的方法就是找到星星的最近邻居并且预测星星将会共享最近邻居类。星星的最近邻居是L,所以我们预测星星表示的歌曲是用户喜欢的歌曲。
Python实现的最近邻分类器代码
我们用之前用过的数据集——对10首歌曲的7个属性(amount of piano, vocals, driving beat, blues influence, dirty electric guitar, backup vocals, rap influence)的评分。用这个数据的图表如下:
之前我们用这个图表开发了一个Python表示这个数据:
这里的字符串有piano, vocals, beat, blues, guitar, backup vocals和 rap出现了好多次。如果我有100000首歌曲,这些字符串将重复100000次。我将移除这些代表数据的字符串,改用简单的向量表示:
此外,我要把用户给出的好评和差评表示出来。因为并不是每一个用户都会给所有的歌曲评价(稀疏数据)。我将用字典方法的字典来搭配。
为了适应新的数据形式我要修改曼哈顿距离和computeNearestNeighbor函数。
最后,我需要创建一个分类函数。我要预测如何用itemName 和 itemVector来表示一个特定的用户对一个事物的评价。比如:
“Enya/ Wild Child” [1, 5, 2.5, 1, 1, 5, 1]
函数首先要做的事就是找到Enya的这首歌的最近邻居。然后找出用户给这个最近邻居的评价,并预测所求用户也会给出同样的评价。这里是我写的基本的分类函数:
我们预测出来Angelica将会喜欢这首歌曲!为什么我们预测这个?
我们预测出Angelica将会喜欢Enya的这首Wild Child因为这首歌的最近邻居是Lady
Gaga/Alejandro ,而这首歌正是Angelica喜欢的。
我们在这里做的是建立一个分类器——在这个情况下,我们的任务是将歌曲分成2组——一组喜欢的,另一组是不喜欢的。
从事什么运动?
先给你一点暗示我们接下来几章将要做什么。试着单独依靠身高和体重来分类世界级的运动员他们所从事的运动。下面的表格里是我从各个不同的网站上收集的一个小的样本数据集。体操的数据列出的是2008奥运会上的前几名运动员。棒球运动员是WNBA的队员。女飞毛腿是2008奥运会上马拉松的最终优胜者。
正如你所看到的,我把年龄包含在表里头了。只有扫一遍数据你就会发现仅仅是年龄这个数据就是一个很好的预测者了。试着猜猜这些运动员从事的运动类型:
答案:
Olivera Jevtic是参加2008奥运会的塞尔维亚长跑运动员。
Jiang Yuyyan赢得奥运会团体体操金牌的时候才16岁。
Jayne Appel是圣安东尼奥女子国家篮球联盟的中锋。
我们把年龄移除。这里是一组我想分类的个体表。
测试数据:
你的任务
1. 基于这章的材料做一个分类器。要用到上面的测试数据并且要能够把他们分开来。我实现的输出会在下面展示出来。你的代码可能会产生跟我不一样的结果。
2. 正确的结果会在这本书的网站上给出(guidetodatamining.com)。从你的程序来分析结果。你的程序的准确率是多少(x%准确率)如果产生了一个不正确的结果你可以解释为什么会这样吗?
3. 成倍地提高顺利数据集的实体数目来提升性能?
你的第二个任务:
在这一章中,我给出了一个开发一个推荐系统的方法的概括,这种方法涉及到用对象的一个属性集和最近邻居法来为对象做一个二分类(喜欢/不喜欢)。我用到了一个很小的数据集包含了7个属性,而且我为一些歌曲做出了评价。
你可以创建一个更好的数据集吗?用至少25个属性并且为至少25个对象评分。你可以创建一个更好的音乐数据集,电影数据集,或者其他任何的。
这个算法在对这些数据集做推荐的时候效果如何呢?
用我自己的2只手
潘多拉的数据集是手动创建的——专家给歌曲的400个属性评价。那是密集的费时的劳动力,但是结果听起来相当好。当然依赖属性来获取数据集的方法并不是只有一种。你可以深入这个网站去获取产品属性。比如,如果我们做一个汽车推荐系统(你正在看2010 Subaru Impreza WRX,你可能还会喜欢。。。)我可以深入像cars.com的网站去获取基本的汽车属性:发动机大小,发动机HP,基础价位,高速MPG。你可以挖掘汽车的文本综述来决定属性的值比如很让人喜欢的功率和上手感觉。如果你推荐的产品类型是数字的,或许你的程序可以直接提取特征。比如对音乐来说,你可以直接提取每分钟的节拍数信息和其他的听觉属性。这与这种方法需要手动建立数据一点关系都没有。
标准分的问题是它很容易受到离群值的影响。比如,如果LargeMart的所有100名员工都是每小时10美元的工资,但是CEO一年能有600万的收入,那么平均每小时的工资是:
( 100 * $10 + 6,000,000 / (40 * 52)) / 101
= (1000 + 2885) / 101
= $38/hr.
在LargeMart来说是个不错的平均工资。正如你所看到的,平均值受到离群值的影响非常大。正因为如此,所以标准分的公式通常都会被修改。
修改过的标准分
![]() |
首先,在上面公式里面的平均数被中值所代替。标准差也被绝对标准差所代替。
其中μ 即为中值。
继续用我们上面的例子,中值是46,绝对标准差是8.18.
修改过的标准分是:
![]() |
你来试试
试一试吧。为下面的数据计算传统标准分和修正过的标准分。.
![]() |
![]() |
该不该规格化呢?
当不同维度的变量变化很显著时,归一化是最合理的。我已经在上面给出了一些例子。如果我们的变量是年龄,收入,大学的平均绩点,收入将会主宰着距离函数。这样的情况下,我们应该规格化数据。在另一种极端情况下,针对Digg上的新闻用户只要给出好评和差评。那么一个二进制值组成的向量来代表用户评价(1=好评,0=差评):
Bill = {0, 0, 0, 1, 1, 1, 1, 0, 1, 0 …
显然这里就没必要正规化数据了。
那么潘多拉的例子呢:所有的变量在1到5的规模。我们需不需要归一化呢?如果我们归一化的话好像不会影响到算法的准确性,但是别忘了,进行归一化需要话费计算代价的。这样看来,我们要有经验地比较这两个方法得出的结果并选择性能最好的。
回到潘多拉
在潘多拉这个例子中,我们用一些属性来代表每一首歌。如果一个用户创建了一个Green Day的无线电台,我们将基于最近邻居方法来决定播放什么样的歌曲。潘多拉的评价体制是好评和差评。我们假设一个用户给一首歌曲评了差评,我们如何来运用这个信息呢?
假设我用2个属性来表示歌曲:脏吉他部分和快速节拍的出现,这两个属性都是1到5的值域。一个用户给他很喜欢的5首歌曲评了好评(下图用“L”表示);给他不喜欢的5首歌曲评了差评(下图用“D”表示)。
你认为该用户会喜欢图中用星号表示的歌曲吗?
![]() |
我猜你会说他喜欢这首歌的。我们的根据是星星在图中离L群更近一些,我们在这章剩下的部分来讨论计算方法。最明显的方法就是找到星星的最近邻居并且预测星星将会共享最近邻居类。星星的最近邻居是L,所以我们预测星星表示的歌曲是用户喜欢的歌曲。
Python实现的最近邻分类器代码
我们用之前用过的数据集——对10首歌曲的7个属性(amount of piano, vocals, driving beat, blues influence, dirty electric guitar, backup vocals, rap influence)的评分。用这个数据的图表如下:
![]() |
之前我们用这个图表开发了一个Python表示这个数据:
![]() |
这里的字符串有piano, vocals, beat, blues, guitar, backup vocals和 rap出现了好多次。如果我有100000首歌曲,这些字符串将重复100000次。我将移除这些代表数据的字符串,改用简单的向量表示:
![]() |
此外,我要把用户给出的好评和差评表示出来。因为并不是每一个用户都会给所有的歌曲评价(稀疏数据)。我将用字典方法的字典来搭配。
![]() |
为了适应新的数据形式我要修改曼哈顿距离和computeNearestNeighbor函数。
![]() |
最后,我需要创建一个分类函数。我要预测如何用itemName 和 itemVector来表示一个特定的用户对一个事物的评价。比如:
“Enya/ Wild Child” [1, 5, 2.5, 1, 1, 5, 1]
函数首先要做的事就是找到Enya的这首歌的最近邻居。然后找出用户给这个最近邻居的评价,并预测所求用户也会给出同样的评价。这里是我写的基本的分类函数:
![]() |
我们预测出来Angelica将会喜欢这首歌曲!为什么我们预测这个?
![]() |
我们预测出Angelica将会喜欢Enya的这首Wild Child因为这首歌的最近邻居是Lady
Gaga/Alejandro ,而这首歌正是Angelica喜欢的。
我们在这里做的是建立一个分类器——在这个情况下,我们的任务是将歌曲分成2组——一组喜欢的,另一组是不喜欢的。
从事什么运动?
先给你一点暗示我们接下来几章将要做什么。试着单独依靠身高和体重来分类世界级的运动员他们所从事的运动。下面的表格里是我从各个不同的网站上收集的一个小的样本数据集。体操的数据列出的是2008奥运会上的前几名运动员。棒球运动员是WNBA的队员。女飞毛腿是2008奥运会上马拉松的最终优胜者。
![]() |
正如你所看到的,我把年龄包含在表里头了。只有扫一遍数据你就会发现仅仅是年龄这个数据就是一个很好的预测者了。试着猜猜这些运动员从事的运动类型:
![]() |
![]() |
![]() |
答案:
Olivera Jevtic是参加2008奥运会的塞尔维亚长跑运动员。
Jiang Yuyyan赢得奥运会团体体操金牌的时候才16岁。
Jayne Appel是圣安东尼奥女子国家篮球联盟的中锋。
我们把年龄移除。这里是一组我想分类的个体表。
测试数据:
![]() |
你的任务
1. 基于这章的材料做一个分类器。要用到上面的测试数据并且要能够把他们分开来。我实现的输出会在下面展示出来。你的代码可能会产生跟我不一样的结果。
2. 正确的结果会在这本书的网站上给出(guidetodatamining.com)。从你的程序来分析结果。你的程序的准确率是多少(x%准确率)如果产生了一个不正确的结果你可以解释为什么会这样吗?
3. 成倍地提高顺利数据集的实体数目来提升性能?
![]() |
你的第二个任务:
在这一章中,我给出了一个开发一个推荐系统的方法的概括,这种方法涉及到用对象的一个属性集和最近邻居法来为对象做一个二分类(喜欢/不喜欢)。我用到了一个很小的数据集包含了7个属性,而且我为一些歌曲做出了评价。
你可以创建一个更好的数据集吗?用至少25个属性并且为至少25个对象评分。你可以创建一个更好的音乐数据集,电影数据集,或者其他任何的。
这个算法在对这些数据集做推荐的时候效果如何呢?
用我自己的2只手
潘多拉的数据集是手动创建的——专家给歌曲的400个属性评价。那是密集的费时的劳动力,但是结果听起来相当好。当然依赖属性来获取数据集的方法并不是只有一种。你可以深入这个网站去获取产品属性。比如,如果我们做一个汽车推荐系统(你正在看2010 Subaru Impreza WRX,你可能还会喜欢。。。)我可以深入像cars.com的网站去获取基本的汽车属性:发动机大小,发动机HP,基础价位,高速MPG。你可以挖掘汽车的文本综述来决定属性的值比如很让人喜欢的功率和上手感觉。如果你推荐的产品类型是数字的,或许你的程序可以直接提取特征。比如对音乐来说,你可以直接提取每分钟的节拍数信息和其他的听觉属性。这与这种方法需要手动建立数据一点关系都没有。
还没人赞这篇日记