Want to tap the power behind search rankings, product recommendations, social bookmarking, and online matchmaking? This fascinating book demonstrates how you can build Web 2.0 applications to mine the enormous amount of data created by people on the Internet. With the sophisticated algorithms in this book, you can write smart programs to access interesting datasets from other w...
Want to tap the power behind search rankings, product recommendations, social bookmarking, and online matchmaking? This fascinating book demonstrates how you can build Web 2.0 applications to mine the enormous amount of data created by people on the Internet. With the sophisticated algorithms in this book, you can write smart programs to access interesting datasets from other web sites, collect data from users of your own applications, and analyze and understand the data once you've found it. Programming Collective Intelligence takes you into the world of machine learning and statistics, and explains how to draw conclusions about user experience, marketing, personal tastes, and human behavior in general -- all from information that you and others collect every day. Each algorithm is described clearly and concisely with code that can immediately be used on your web site, blog, Wiki, or specialized application. This book explains: * Collaborative filtering techniques that enable online retailers to recommend products or media * Methods of clustering to detect groups of similar items in a large dataset * Search engine features -- crawlers, indexers, query engines, and the PageRank algorithm * Optimization algorithms that search millions of possible solutions to a problem and choose the best one * Bayesian filtering, used in spam filters for classifying documents based on word types and other features * Using decision trees not only to make predictions, but to model the way decisions are made * Predicting numerical values rather than classifications to build price models * Support vector machines to match people in online dating sites * Non-negative matrix factorization to find the independent features in a dataset * Evolving intelligence for problem solving -- how a computer develops its skill by improving its own code the more it plays a game Each chapter includes exercises for extending the algorithms to make them more powerful. Go beyond simple database-backed applications and put the wealth of Internet data to work for you. "Bravo! I cannot think of a better way for a developer to first learn these algorithms and methods, nor can I think of a better way for me (an old AI dog) to reinvigorate my knowledge of the details." -- Dan Russell, Google "Toby's book does a great job of breaking down the complex subject matter of machine-learning algorithms into practical, easy-to-understand examples that can be directly applied to analysis of social interaction across the Web today. If I had this book two years ago, it would have saved precious time going down some fruitless paths." -- Tim Wolters, CTO, Collective Intellect
作者简介
· · · · · ·
Toby Segaran works as a Data Magnate at Metaweb Technologies. Prior to working at Metaweb, he started a biotech software company called Incellico which was later acquired by Genstruct. His book, "Programming Collective Intelligence" has been the best-selling AI book on Amazon for several months. He is the recipient of a National Interest Waiver for "People of Exceptional Abilit...
Toby Segaran works as a Data Magnate at Metaweb Technologies. Prior to working at Metaweb, he started a biotech software company called Incellico which was later acquired by Genstruct. His book, "Programming Collective Intelligence" has been the best-selling AI book on Amazon for several months. He is the recipient of a National Interest Waiver for "People of Exceptional Ability", and currently lives in San Francisco. His blog and other information are located at kiwitobes.com.
涵盖了一些常见的数据挖掘算法,和内容对比书名似乎有点容易误导,除非说只要是数据集都算collective。各种算法蜻蜓点水,这次算是借本书为索引,再去搜索、巩固一些基本知识。一些应用试用场景及细节讲得不错,但是没有对应上专有术语也没有引用,导致入门者难以深入。代码和实验没怎么看得进去(genetic programming那章实现除外)。随机优化那一章收获蛮多的:cost function, re...涵盖了一些常见的数据挖掘算法,和内容对比书名似乎有点容易误导,除非说只要是数据集都算collective。各种算法蜻蜓点水,这次算是借本书为索引,再去搜索、巩固一些基本知识。一些应用试用场景及细节讲得不错,但是没有对应上专有术语也没有引用,导致入门者难以深入。代码和实验没怎么看得进去(genetic programming那章实现除外)。随机优化那一章收获蛮多的:cost function, representation of constrained problem, similar solutions yield similar results。(展开)
总结书中提到的各种分类算法: 朴素贝叶斯(naïve Bayesian): 优点:速度快,支持增量训练,易于理解 缺点:无法解决特征组合的情况 The biggest downside to naïve Bayesian classifiers is their inability to deal with outcomes that change based on combinations of features. Imagine the following scenario in which you are trying to distinguish spam from nonspam email: let’s sa...
The biggest downside to naïve Bayesian classifiers is their inability to deal with
outcomes that change based on combinations of features. Imagine the following
scenario in which you are trying to distinguish spam from nonspam email: let’s say your job is building web applications, so the word “online” frequently appears in
your work-related email. Your best friend works at a pharmacy and likes sending you
funny stories about things that happen to him at work. Also, like most people who
haven’t closely guarded their email addresses, you occasionally receive spam
containing the words “online pharmacy.”
You can probably see the dilemma here already—the classifier is constantly being
told that “online” and “pharmacy” exist in nonspam email messages, so their proba-
bilities become higher for nonspam. When you tell the classifier that a certain email message with the words “online pharmacy” is spam, those words are adjusted
slightly more toward spam, creating a constant battle. Since features are all given
probabilities separately, the classifier can never learn about combinations. In
document classification this is usually not a big deal, since an email message with the
words “online pharmacy” probably contains other spam indicators, but in other
problems, understanding feature combinations can be much more important.引自第296页
import random
import Route
import Map
class Genome():
def __init__(self,genome_length=70,pop_size=140,mutation_rate=0.001,crossover_rate=0.7,mapb=None):
self.GENOME_LENGTH=genome_length
self.POP_SIZE=pop_size
self.MUTATION_RATE=mutation_rate
self.CROSSOVER_RATE=crossover_rate
self.mapb=mapb
self._createFirstGeneration()
def _createFirstGeneration(self):
self.pops=[]
for i in range(0,self.POP_SIZE):
self.pops.append(self._createRt())
def _createRt(self):
rt=Route.Route()
rtd=[]
for i in range(0,self.GENOME_LENGTH):
rtd.append(random.randint(0,1)==0)
rt.setRt(rtd)
return rt
def _updateFitness(self):
bsc=0
self.tsc=0
for i in range(0,len(self.pops)):
sc=self.mapb.getsc(self.pops[i].getRt())
self.tsc+=sc
bsc=((sc>bsc) and sc or bsc)
self.pops[i].setsc(sc)
return bsc
def _mutate(self,rt):
rd=rt.getRt()
for i in range(0,len(rd)):
if random.random<self.MUTATION_RATE:
rd[i]=rd[i]==False
def _crossover(self,fa,mo,baby1,baby2):
fd=fa.getRt()
md=mo.getRt()
if random.random()>self.CROSSOVER_RATE or fa.same(mo):
baby1.setRt(fd)
baby2.setRt(md)
else:
cp=random.randint(1,self.GENOME_LENGTH-2)
bd1=[]
bd2=[]
for i in range(0,cp):
bd1.append(fd[i])
bd2.append(md[i])
for i in range(cp,self.GENOME_LENGTH):
bd1.append(md[i])
bd2.append(fd[i])
baby1.setRt(bd1)
baby2.setRt(bd2)
def _select(self):
thresc=self.tsc*random.random()
tmpsc=0
sel=-1
for i in range(0,self.POP_SIZE):
tmpsc+=self.pops[i].sc
if tmpsc>=thresc:
return self.pops[i]
def _epoch(self):
newgen=[]
for i in range(0,self.POP_SIZE/2):
fa=self._select()
mo=self._select()
baby1=Route.Route()
baby2=Route.Route()
self._crossover(fa, mo, baby1, baby2)
self._mutate(baby1)
self._mutate(baby2)
newgen.append(baby1)
newgen.append(baby2)
self.pops=newgen
def start(self):
gene=1
bsc=self._updateFitness()
if bsc==1:
print 'succ at %s gene' %gene
return
else:
print 'gene %s : %.4f' %(gene,bsc)
while gene<50:
self._epoch()
gene+=1
bsc=self._updateFitness()
if bsc==1:
print 'succ at %s gene' %gene
return
else:
print 'gene %s : %.4f' %(gene,bsc)
mapdata=[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1],
[5, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1],
[1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8],
[1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]];
mapb=Map.mapb(mapdata)
genome=Genome(mapb=mapb)
genome.start()
Route.py
class Route():
def __init__(self):
self.sc=0
def setRt(self,route):
self.rt=route
def getRt(self):
return self.rt
def setsc(self,score):
self.sc=score
def same(self,ort):
od=ort.getRt()
for i in range(0,len(self.rt)):
if self.rt[i]!=od[i]:
return False
return True
Map.py
class mapb():
def __init__(self,mapdata):
self.md=mapdata
self.len_x=len(mapdata[0])
self.len_y=len(mapdata)
self._getEntry()
def _getEntry(self):
for i in range(0,len(self.md)):
l=self.md[i]
for j in range(0,len(l)):
if l[j]==5:
self.start_x=j
self.start_y=i
elif l[j]==8:
self.end_x=j
self.end_y=i
def getsc(self,rt):
pos_x=self.start_x
pos_y=self.start_y
for i in range(0,len(rt)/2):
mv=(rt[i] and 2 or 0)+(rt[i+1] and 1 or 0)
if mv==0:
if self._isvalid(pos_x, pos_y-1):
pos_y=pos_y-1
elif mv==1:
if self._isvalid(pos_x, pos_y+1):
pos_y=pos_y+1
elif mv==2:
if self._isvalid(pos_x+1, pos_y):
pos_x=pos_x+1
elif mv==3:
if self._isvalid(pos_x-1, pos_y):
pos_x=pos_x-1
return 1.0/(1+abs(pos_x-self.end_x)+abs(pos_y-self.end_y))
def _isvalid(self,x,y):
if x<0|y<0|x>self.len_x-1|y>self.len_y-1:
return False
return True
import random
import Route
import Map
class Genome():
def __init__(self,genome_length=70,pop_size=140,mutation_rate=0.001,crossover_rate=0.7,mapb=None):
self.GENOME_LENGTH=genome_length
self.POP_SIZE=pop_size
self.MUTATION_RATE=mutation_rate
self.CROSSOVER_RATE=crossover_rate
self.mapb=mapb
self._createFirstGeneration()
def _createFirstGeneration(self):
self.pops=[]
for i in range(0,self.POP_SIZE):
self.pops.append(self._createRt())
def _createRt(self):
rt=Route.Route()
rtd=[]
for i in range(0,self.GENOME_LENGTH):
rtd.append(random.randint(0,1)==0)
rt.setRt(rtd)
return rt
def _updateFitness(self):
bsc=0
self.tsc=0
for i in range(0,len(self.pops)):
sc=self.mapb.getsc(self.pops[i].getRt())
self.tsc+=sc
bsc=((sc>bsc) and sc or bsc)
self.pops[i].setsc(sc)
return bsc
def _mutate(self,rt):
rd=rt.getRt()
for i in range(0,len(rd)):
if random.random<self.MUTATION_RATE:
rd[i]=rd[i]==False
def _crossover(self,fa,mo,baby1,baby2):
fd=fa.getRt()
md=mo.getRt()
if random.random()>self.CROSSOVER_RATE or fa.same(mo):
baby1.setRt(fd)
baby2.setRt(md)
else:
cp=random.randint(1,self.GENOME_LENGTH-2)
bd1=[]
bd2=[]
for i in range(0,cp):
bd1.append(fd[i])
bd2.append(md[i])
for i in range(cp,self.GENOME_LENGTH):
bd1.append(md[i])
bd2.append(fd[i])
baby1.setRt(bd1)
baby2.setRt(bd2)
def _select(self):
thresc=self.tsc*random.random()
tmpsc=0
sel=-1
for i in range(0,self.POP_SIZE):
tmpsc+=self.pops[i].sc
if tmpsc>=thresc:
return self.pops[i]
def _epoch(self):
newgen=[]
for i in range(0,self.POP_SIZE/2):
fa=self._select()
mo=self._select()
baby1=Route.Route()
baby2=Route.Route()
self._crossover(fa, mo, baby1, baby2)
self._mutate(baby1)
self._mutate(baby2)
newgen.append(baby1)
newgen.append(baby2)
self.pops=newgen
def start(self):
gene=1
bsc=self._updateFitness()
if bsc==1:
print 'succ at %s gene' %gene
return
else:
print 'gene %s : %.4f' %(gene,bsc)
while gene<50:
self._epoch()
gene+=1
bsc=self._updateFitness()
if bsc==1:
print 'succ at %s gene' %gene
return
else:
print 'gene %s : %.4f' %(gene,bsc)
mapdata=[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1],
[5, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1],
[1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8],
[1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]];
mapb=Map.mapb(mapdata)
genome=Genome(mapb=mapb)
genome.start()
Route.py
class Route():
def __init__(self):
self.sc=0
def setRt(self,route):
self.rt=route
def getRt(self):
return self.rt
def setsc(self,score):
self.sc=score
def same(self,ort):
od=ort.getRt()
for i in range(0,len(self.rt)):
if self.rt[i]!=od[i]:
return False
return True
Map.py
class mapb():
def __init__(self,mapdata):
self.md=mapdata
self.len_x=len(mapdata[0])
self.len_y=len(mapdata)
self._getEntry()
def _getEntry(self):
for i in range(0,len(self.md)):
l=self.md[i]
for j in range(0,len(l)):
if l[j]==5:
self.start_x=j
self.start_y=i
elif l[j]==8:
self.end_x=j
self.end_y=i
def getsc(self,rt):
pos_x=self.start_x
pos_y=self.start_y
for i in range(0,len(rt)/2):
mv=(rt[i] and 2 or 0)+(rt[i+1] and 1 or 0)
if mv==0:
if self._isvalid(pos_x, pos_y-1):
pos_y=pos_y-1
elif mv==1:
if self._isvalid(pos_x, pos_y+1):
pos_y=pos_y+1
elif mv==2:
if self._isvalid(pos_x+1, pos_y):
pos_x=pos_x+1
elif mv==3:
if self._isvalid(pos_x-1, pos_y):
pos_x=pos_x-1
return 1.0/(1+abs(pos_x-self.end_x)+abs(pos_y-self.end_y))
def _isvalid(self,x,y):
if x<0|y<0|x>self.len_x-1|y>self.len_y-1:
return False
return True
Pearson Correlation Score A slightly more sophisticated way to determine the similarity between people’s inter- ests is to use a Pearson correlation coefficient. The correlation coefficient is a mea- sure of how well two sets of data fit on a straight line. The formula for this is more complicated than the Euclidean distance score, but it tends to give better results in situations where the da...
2011-04-18 14:02:27
Pearson Correlation Score
A slightly more sophisticated way to determine the similarity between people’s inter-
ests is to use a Pearson correlation coefficient. The correlation coefficient is a mea-
sure of how well two sets of data fit on a straight line. The formula for this is more
complicated than the Euclidean distance score, but it tends to give better results in
situations where the data isn’t well normalized—for example, if critics’ movie rank-
ings are routinely more harsh than average.引自第11页
无可否认,这是一本好书,作者有非常深厚的功力,可以将有些比较抽象的算法通过代码讲解的很容易理解。但是书中部分代码有些错误: 第11页的sim_distance函数的代码 from math import sqrt def sim_distance(prefs, person1, person2): si = {} for item in prefs[person1]: if item in prefs[person2]: si[item] = 1 if len(si) == 0: return 0 sum_of_squares = sum([pow(prefs[person1][item] - prefs[person2][item], 2) fo...
from math import sqrt
def sim_distance(prefs, person1, person2):
si = {}
for item in prefs[person1]:
if item in prefs[person2]:
si[item] = 1
if len(si) == 0: return 0
sum_of_squares = sum([pow(prefs[person1][item] - prefs[person2][item], 2) for item in si if item in si])
return 1 / (1 + sqrt(sum_of_squares)) # 书上这里少了一个sqrt函数
key words: supervised learning and unsupervised learning "Techniques that use example inputs and outputs to learn how to make predictions are known as supervised leaning method. Including neural networks, decision trees, support-vector machines, and Bayesian filtering. when we want to extract information using one of these methods, enter a set of inputs and expect the application to produce an...
2015-02-17 11:16:24
key words: supervised learning and unsupervised learning
"Techniques that use example inputs and outputs to learn how to make predictions are known as supervised leaning method. Including neural networks, decision trees, support-vector machines, and Bayesian filtering.
when we want to extract information using one of these methods, enter a set of inputs and expect the application to produce an output based on what it has learnd so far.
Clustering is an example of unsupervised learning. Unsupervised learning algorithms are not trained with examples of correct answers. Their purpose is to find structure within a set of data where no one piece of data is the answer."
import random
import Route
import Map
class Genome():
def __init__(self,genome_length=70,pop_size=140,mutation_rate=0.001,crossover_rate=0.7,mapb=None):
self.GENOME_LENGTH=genome_length
self.POP_SIZE=pop_size
self.MUTATION_RATE=mutation_rate
self.CROSSOVER_RATE=crossover_rate
self.mapb=mapb
self._createFirstGeneration()
def _createFirstGeneration(self):
self.pops=[]
for i in range(0,self.POP_SIZE):
self.pops.append(self._createRt())
def _createRt(self):
rt=Route.Route()
rtd=[]
for i in range(0,self.GENOME_LENGTH):
rtd.append(random.randint(0,1)==0)
rt.setRt(rtd)
return rt
def _updateFitness(self):
bsc=0
self.tsc=0
for i in range(0,len(self.pops)):
sc=self.mapb.getsc(self.pops[i].getRt())
self.tsc+=sc
bsc=((sc>bsc) and sc or bsc)
self.pops[i].setsc(sc)
return bsc
def _mutate(self,rt):
rd=rt.getRt()
for i in range(0,len(rd)):
if random.random<self.MUTATION_RATE:
rd[i]=rd[i]==False
def _crossover(self,fa,mo,baby1,baby2):
fd=fa.getRt()
md=mo.getRt()
if random.random()>self.CROSSOVER_RATE or fa.same(mo):
baby1.setRt(fd)
baby2.setRt(md)
else:
cp=random.randint(1,self.GENOME_LENGTH-2)
bd1=[]
bd2=[]
for i in range(0,cp):
bd1.append(fd[i])
bd2.append(md[i])
for i in range(cp,self.GENOME_LENGTH):
bd1.append(md[i])
bd2.append(fd[i])
baby1.setRt(bd1)
baby2.setRt(bd2)
def _select(self):
thresc=self.tsc*random.random()
tmpsc=0
sel=-1
for i in range(0,self.POP_SIZE):
tmpsc+=self.pops[i].sc
if tmpsc>=thresc:
return self.pops[i]
def _epoch(self):
newgen=[]
for i in range(0,self.POP_SIZE/2):
fa=self._select()
mo=self._select()
baby1=Route.Route()
baby2=Route.Route()
self._crossover(fa, mo, baby1, baby2)
self._mutate(baby1)
self._mutate(baby2)
newgen.append(baby1)
newgen.append(baby2)
self.pops=newgen
def start(self):
gene=1
bsc=self._updateFitness()
if bsc==1:
print 'succ at %s gene' %gene
return
else:
print 'gene %s : %.4f' %(gene,bsc)
while gene<50:
self._epoch()
gene+=1
bsc=self._updateFitness()
if bsc==1:
print 'succ at %s gene' %gene
return
else:
print 'gene %s : %.4f' %(gene,bsc)
mapdata=[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1],
[5, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1],
[1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1],
[1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 8],
[1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]];
mapb=Map.mapb(mapdata)
genome=Genome(mapb=mapb)
genome.start()
Route.py
class Route():
def __init__(self):
self.sc=0
def setRt(self,route):
self.rt=route
def getRt(self):
return self.rt
def setsc(self,score):
self.sc=score
def same(self,ort):
od=ort.getRt()
for i in range(0,len(self.rt)):
if self.rt[i]!=od[i]:
return False
return True
Map.py
class mapb():
def __init__(self,mapdata):
self.md=mapdata
self.len_x=len(mapdata[0])
self.len_y=len(mapdata)
self._getEntry()
def _getEntry(self):
for i in range(0,len(self.md)):
l=self.md[i]
for j in range(0,len(l)):
if l[j]==5:
self.start_x=j
self.start_y=i
elif l[j]==8:
self.end_x=j
self.end_y=i
def getsc(self,rt):
pos_x=self.start_x
pos_y=self.start_y
for i in range(0,len(rt)/2):
mv=(rt[i] and 2 or 0)+(rt[i+1] and 1 or 0)
if mv==0:
if self._isvalid(pos_x, pos_y-1):
pos_y=pos_y-1
elif mv==1:
if self._isvalid(pos_x, pos_y+1):
pos_y=pos_y+1
elif mv==2:
if self._isvalid(pos_x+1, pos_y):
pos_x=pos_x+1
elif mv==3:
if self._isvalid(pos_x-1, pos_y):
pos_x=pos_x-1
return 1.0/(1+abs(pos_x-self.end_x)+abs(pos_y-self.end_y))
def _isvalid(self,x,y):
if x<0|y<0|x>self.len_x-1|y>self.len_y-1:
return False
return True
0 有用 千里驴 2011-05-09 22:24:53
深入浅出
3 有用 贝塔 2008-11-10 14:08:13
这本书最大的好处就在于有最为具体的实例,让你想看不懂都难,想不知道怎么用都难。天下的书要是都能这么写,我也不至于这么文盲了。
0 有用 六月 2009-07-04 01:04:05
非常好
0 有用 洋葱 2012-06-09 05:02:37
觉得应该给三星半。结构内容是不错,只是API各种过期,例如geocoding的那个。书上代码有问题的地方也不少。
0 有用 fastzhong 2011-05-14 11:58:11
just open your eyes in this area, not the best solutions from trench.
0 有用 刘家宝树 2020-02-03 16:32:50
开拓视野
0 有用 leechau 2019-02-08 20:23:31
分析到位,内容有点旧。
0 有用 simoncos 2018-12-06 14:02:39
涵盖了一些常见的数据挖掘算法,和内容对比书名似乎有点容易误导,除非说只要是数据集都算collective。各种算法蜻蜓点水,这次算是借本书为索引,再去搜索、巩固一些基本知识。一些应用试用场景及细节讲得不错,但是没有对应上专有术语也没有引用,导致入门者难以深入。代码和实验没怎么看得进去(genetic programming那章实现除外)。随机优化那一章收获蛮多的:cost function, re... 涵盖了一些常见的数据挖掘算法,和内容对比书名似乎有点容易误导,除非说只要是数据集都算collective。各种算法蜻蜓点水,这次算是借本书为索引,再去搜索、巩固一些基本知识。一些应用试用场景及细节讲得不错,但是没有对应上专有术语也没有引用,导致入门者难以深入。代码和实验没怎么看得进去(genetic programming那章实现除外)。随机优化那一章收获蛮多的:cost function, representation of constrained problem, similar solutions yield similar results。 (展开)
0 有用 level 2018-11-27 22:10:05
原理讲得非常清楚明白,但是书中很多例子和代码都已经过时了
0 有用 vinceguo 2018-07-02 13:05:33
这种蠢书评价这么高,看来真的是阿猫阿狗也说自己在搞机器学习