一、前言
Summary:
本文不会详细讲解python基础知识,主要重点描述KMeans的基本原理和python实现一个案例的全过程,附源码。
KMeans算法介绍:https://www.cnblogs.com/zhahuhu/archive/2019/10/26/11745484.html
Conditions:
1、熟悉python基础语法和数据结构。
2、熟悉机器学习基本理论。
3、熟悉KMeans算法。
Concepts:
Part1: 朴素贝叶斯模型(Naive Bayesian Model,NBM)
朴素贝叶斯的思想就是根据某些个先验概率计算Y变量属于某个类别的后验概率,也就是根据先前事件的有关数据估计未来某个事件发生的概率。贝叶斯定理如下图。分类的时候,某个事件属于那一类的概率更大,我们就认为它应该分到那一类。
举例:一个学校内有60%的学生是男生,40%的学生是女生。根据统计,男生总是穿长裤,女生则有一半穿长裤,一半穿裙子。
问题:假设在校园中随机抽取一个穿长裤的学生,推断该学生是女生的概率?---0.25
Part2: 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法
我们要确定绿点属于哪个颜色(红色或者蓝色),要做的就是选出距离目标点距离最近的k个点,看这k个点的大多数颜色是什么颜色。当k取3的时候,我们可以看出距离最近的三个,分别是红色、红色、蓝色,因此得到目标点为红色。
Part3: k均值聚类算法(k-means clustering algorithm)
机器学习中有两类的大问题,一个是分类,一个是聚类。分类是监督学习,原始数据有标签,可以根据原始数据建立模型,确定新来的数据属于哪一类。聚类是一种无监督学习,聚类是指事先没有“标签”,在数据中发现数据对象之间的关系,将数据进行分组,一个分组也叫做“一个簇”, 组内的相似性越大,组间的差别越大,则聚类效果越好,也就是簇内对象有较高的相似度,簇之间的对象相似度比较低,则聚类效果越好。K-means就是一个聚类算法。
二、场景描述与源码
场景:比如一个IT培训机构想在微博投放python培训广告,为了提高转化率,需要精准投放广告,怎么办呢?微博会收集所有用户的历史发表记录,进行分词、分类,构建用户画像,然后将里面有提到IT、python的微博注册用户视为潜在客户进行广告推送。
下面这个例子,是对庄子的《逍遥游》作为文本,整个xiaoyaoyou.txt当作庄子全集,每一行当作庄子的一篇文章,通过KMeans算法进行分类,分析每一篇文章的关键字,那几篇文章是同一类型的作品。每一行代码都有注释和打印,这里就不赘述。
附完整源码:
from sklearn.feature_extraction.textimport CountVectorizer, TfidfTransformer
from sklearn.clusterimport KMeans
import numpyas np
import codecs
#########################################################################
# 第一步 计算TFIDF
# 文档预料 空格连接
corpus = []
#读取预料 一行预料为一个文档
f =open("./xiaoyaoyou.txt",'rb')
for linein f.readlines():
line = line.decode("UTF-8").strip()
#print(line)
corpus.append(line)
f.close()
print(corpus)
#将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer()
#该类会统计每个词语的tf-idf权值
transform = TfidfTransformer()
#第一个fit_transform是将文本转为词频矩阵
X = vectorizer.fit_transform(corpus)
print(np.shape(X))
print(X)
#第二个fit_transform是计算tf-idf
tfidf = transform.fit_transform(X)
#获取词袋模型中的所有词语
word = vectorizer.get_feature_names()
print("word's length : %d " %len(word))
print("words : %s " % word)
#将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重
weight = tfidf.toarray()
print(np.shape(weight))
print("weight: %s " % weight)
#写入、保存特征向量文本内容
result = codecs.open("./xyy_reslut.txt",'w','UTF-8')
for jin range(len(word)):
result.write(word[j] +' ')
result.write('\r\n\r\n')
#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
print("weight's length : %d" %len(weight))
for iin range(len(weight)):
#print("-------这里输出第", i, u"类文本的词语tf-idf权重------")
for jin range(len(word)):
result.write(str(weight[i][j]) +' ')
result.close()
########################################################################
# 第二步 聚类Kmeans
print("---------Start Kmeans:--------")
clf = KMeans(n_clusters=20)
s = clf.fit(weight)
print(s)
#20个中心点
centerids = clf.cluster_centers_
print(np.shape(centerids))
print(centerids)
#每个样本所属的簇
labels = clf.labels_
print(len(labels))
print(labels)
print(dict([(i,list(labels).count(i))for iin labels]))
#用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数,类似于损失函数(方差函数)
interia = clf.inertia_
print(interia)
# 第三步 分类,而不是预测
#分类,同label_
result_predict = clf.predict(X)
print("-----str_predict-----")
print(result_predict)
print(clf.score(X))
三、文本附件
xiaoyaoyou.txt,做聚类用的源文本
一年而野
之人也之人也北冥有鱼,其名为鲲。鲲之大,不知其几千里也;化而为鸟,其名为鹏。鹏之背,不知其几千里也;
怒而飞,其翼若垂天之云。是鸟也,海运则将徙于南冥。南冥者,天池也。《齐谐》者,志怪者也。
《谐》之言曰:“鹏之徙于南冥也,水击三千里,抟扶摇而上者九万里,去以六月息者也。”野马也,尘埃也,生物之以息相吹也。
之人也天之苍苍,其正色邪?其远而无所至极邪?其视下也,亦若是则已矣。且夫水之积也不厚,则其负大舟也无力。
覆杯水于坳堂之上,则芥为之舟;置杯焉则胶,水浅而舟大也。风之积也不厚,则其负大翼也无力。
故九万里,则风斯在下矣,而后乃今培风;背负青天,而莫之夭阏者,而后乃今将图南。
蜩与学鸠笑之曰:“我决起而飞,抢榆枋而止,时则不至,而控于地而已矣,奚以之九万里而南为?”
适莽苍者,三餐而反,腹犹果然;适百里者,宿舂粮;适千里者,三月聚粮。之二虫又何知!小知不及大知,小年不及大年。
奚以知其然也?朝菌不知晦朔,蟪蛄不知春秋,此小年也。楚之南有冥灵者,以五百岁为春,五百岁为秋;
上古有大椿者,以八千岁为春,八千岁为秋。此大年也。而彭祖乃今以久特闻,众人匹之,不亦悲乎?
汤之问棘也是已:“穷发之北,有冥海者,天池也。有鱼焉,其广数千里,未有知其修者,其名为鲲。
有鸟焉,其名为鹏,背若泰山,翼若垂天之云;抟扶摇羊角而上者九万里,绝云气,负青天,然后图南,且适南冥也。
斥鷃笑之曰:‘彼且奚适也?我腾跃而上,不过数仞而下,翱翔蓬蒿之间,此亦飞之至也。而彼且奚适也?’”此小大之辩也。
故夫知效一官、行比一乡、德合一君、而征一国者,其自视也,亦若此矣。
而宋荣子犹然笑之。且举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世,未数数然也。
虽然,犹有未树也。夫列子御风而行,泠然善也,旬有五日而后反。彼于致福者,未数数然也。此虽免乎行,犹有所待者也。
若夫乘天地之正,而御六气之辩,以游无穷者,彼且恶乎待哉?故曰:至人无己,神人无功,圣人无名。
尧让天下于许由,曰:“日月出矣,而爝火不息;其于光也,不亦难乎?
时雨降矣,而犹浸灌;其于泽也,不亦劳乎?夫子立而天下治,而我犹尸之;
吾自视缺然,请致天下。”许由曰:“子治天下,天下既已治也;而我犹代子,吾将为名乎?名者,实之宾也;吾将为宾乎?
鹪鹩巢于深林,不过一枝;偃鼠饮河,不过满腹。归休乎君,予无所用天下为!庖人虽不治庖,尸祝不越樽俎而代之矣!”
肩吾问于连叔曰:“吾闻言于接舆,大而无当,往而不反。吾惊怖其言。
犹河汉而无极也;大有径庭,不近人情焉。”连叔曰:“其言谓何哉?”
曰:“藐姑射之山,有神人居焉。肌肤若冰雪,淖约若处子,不食五谷,吸风饮露,乘云气,御飞龙,而游乎四海之外;
其神凝,使物不疵疠而年谷熟。吾以是狂而不信也。”连叔曰:“然。瞽者无以与乎文章之观,聋者无以与乎钟鼓之声。
岂唯形骸有聋盲哉?夫知亦有之!是其言也犹时女也。之人也,之德也,将旁礴万物以为一,世蕲乎乱,孰弊弊焉以天下为事!
之人也,物莫之伤:大浸稽天而不溺,大旱金石流,土山焦而不热。是其尘垢秕糠将犹陶铸尧舜者也,孰肯以物为事?”
宋人资章甫而适诸越,越人断发文身,无所用之。尧治天下之民,平海内之政,往见四子藐姑射之山,汾水之阳,窅然丧其天下焉。
惠子谓庄子曰:“魏王贻我大瓠之种,我树之成,而实五石。
以盛水浆,其坚不能自举也。剖之以为瓠,则瓠落无所容。非不呺然大也,吾为其无用而掊之。”
庄子曰:“夫子固拙于用大矣。宋人有善为不龟手之药者,世世以洴澼絖为事。客闻之,请买其方百金。
聚族而谋曰:‘我世世为洴澼絖,不过数金,今一朝而鬻技百金,请与之。’客得之,以说吴王。
越有难,吴王使之将,冬,与越人水战,大败越人。裂地而封之。能不龟手一也,或以封,或不免于洴澼絖,则所用之异也。
今子有五石之瓠,何不虑以为大樽,而浮于江湖,而忧其瓠落无所容?则夫子犹有蓬之心也夫!”
惠子谓庄子曰:“吾有大树,人谓之樗。
其大本拥肿而不中绳墨,其小枝卷曲而不中规矩,立之涂,匠人不顾。今子之言大而无用,众所同去也。”
庄子曰:“子独不见狸狌乎?卑身而伏,以候敖者;东西跳梁,不辟高下;
中于机辟,死于罔罟。今夫斄牛,其大若垂天之云。此能为大矣,而不能执鼠。
今子有大树,患其无用,何不树之于无何有之乡,广莫之野,彷徨乎无为其侧,逍遥乎寝卧其下。
不夭斤斧,物无害者,无所可用,安所困苦哉!”
寓言十九,重言十七,卮言日出,和以天倪。寓言十九,藉外论之 。亲父不为其子媒。
亲父誉之,不若非其父者也。非吾罪也,人之罪 也。与己同则应,不与己同则反。
同于己为是之,异于己为非之。重 言十七,所以己言也。
是为耆艾,年先矣,而无经纬本末以期年耆者 ,是非先也。
人而无以先人,无人道也。人而无人道,是之谓陈人。
卮言日出,和以天倪,因以曼衍,所以穷年。不言则齐,齐与言不齐 ,言与齐不齐也。
故曰:“言无言。”言无言:终身言,未尝言;终 身不言,未尝不言。
有自也而可,有自也而不可;有自也而然,有自 也而不然。
恶乎然?然于然;恶乎不然?不然于不然。
恶乎可?可于 可;恶乎不可?不可于不可。物固有所然,物固有所可。无物不然, 无物不可。非卮言日出,和以天倪,孰得其久!
万物皆种也,以不同 形相禅,始卒若环,莫得其伦,是谓天均。天均者,天倪也。
庄子谓惠子曰:“孔子行年六十而六十化。始时所是,卒而非之。 未知今之所谓是之非五十九非也。
”惠子曰:“孔子勤志服知也。” 庄子曰:“孔子谢之矣,而其未之尝言也。孔子云:夫受才乎大本, 复灵以生。鸣而当律,言而当法。
利义陈乎前,而好恶是非直服人之 口而已矣。
使人乃以心服而不敢蘁,立定天下之定。已乎,已乎!吾 且不得及彼乎!”
颜成子游谓东郭子綦曰:“自吾闻子之言,一年而野,二年而从, 三年而通,四年而物,五年而来,六年而鬼入,七年而天成,八年而 不知死、不知生,九年而大妙。生有为,死也。
劝公以其私,死也有 自也,而生阳也,无自也。而果然乎?恶乎其所适,恶乎其所不适?
天有历数,地有人据,吾恶乎求之?莫知其所终,若之何其无命也?
莫知其所始,若之何其有命也?有以相应也,若之何其无鬼邪?
无以 相应也,若之何其有鬼邪?”
众罔两问于景曰:“若向也俯而今也仰,向也括撮而今也被发;
向 也坐而今也起;向也行而今也止:何也?”景曰:“搜搜也,奚稍问 也!予有而不知其所以。
予,蜩甲也,蛇蜕也,似之而非也。火与日 ,吾屯也;阴与夜,吾代也。彼,吾所以有待邪,而况乎以无有待者 乎!
彼来则我与之来,彼往则我与之往,彼强阳则我与之强阳。强阳 者,又何以有问乎!”
阳子居南之沛,老聃西游于秦。邀于郊,至于梁而遇老子。
老子中 道仰天而叹曰:“始以汝为可教,今不可也。”阳子居不答。
至舍, 进盥漱巾栉,脱屦户外,膝行而前,曰:“向者弟子欲请夫子,夫子 行不闲,是以不敢;今闲矣,请问其故。”
老子曰:“而睢睢盱盱, 而谁与居!大白若辱,盛德若不足。”阳子居蹴然变容曰:“敬闻命 矣!”
其往也,舍者迎将其家,公执席,妻执巾栉,舍者避席,炀者 避灶。
其反也,舍者与之争席矣!
秋水时至,百川灌河。泾流之大,两涘渚崖之间,不辩牛马。
于是 焉河伯欣然自喜,以天下之美为尽在己。
顺流而东行,至于北海,东 面而视,不见水端。
于是焉河伯始旋其面目,望洋向若而叹曰:“野 语有之曰:‘闻道百,以为莫己若者。
’我之谓也。且夫我尝闻少仲 尼之闻而轻伯夷之义者,始吾弗信。
今我睹子之难穷也,吾非至于子 之门则殆矣,吾长见笑于大方之家。”
北海若曰:“井蛙不可以语于海者,拘于虚也;夏虫不可以语于冰者,笃于时也;
曲士不可以语于 道者,束于教也。今尔出于崖涘,观于大海,乃知尔丑,尔将可与语 大理矣。
天下之水,莫大于海:万川归之,不知何时止而不盈;尾闾 泄之,不知何时已而不虚;
春秋不变,水旱不知。此其过江河之流, 不可为量数。
而吾未尝以此自多者,自以比形于天地,而受气于阴阳, 吾在于天地之间,犹小石小木之在大山也。
方存乎见少,又奚以自多! 计四海之在天地之间也,不似礨空之在大泽乎?
计中国之在海内不似 稊米之在太仓乎?号物之数谓之万,人处一焉;
人卒九州,谷食之所 生,舟车之所通,人处一焉。此其比万物也,不似豪末之在于马体乎?
五帝之所连,三王之所争,仁人之所忧,任士之所劳,尽此矣!
伯夷 辞之以为名,仲尼语之以为博。此其自多也,不似尔向之自多于水乎?”
夔怜蚿,蚿怜蛇,蛇怜风,风怜目,目怜心。
夔谓蚿曰:“吾以一 足趻踔而不行,予无如矣。今子之使万足,独奈何?”
蚿曰:“不然。 子不见夫唾者乎?喷则大者如珠,小者如雾,杂而下者不可胜数也。
今予动吾天机,而不知其所以然。”蚿谓蛇曰:“吾以众足行,而不 及子之无足,何也?”
蛇曰:“夫天机之所动,何可易邪?吾安用足 哉!”蛇谓风曰:“予动吾脊胁而行,则有似也。
今子蓬蓬然起于北 海,蓬蓬然入于南海,而似无有,何也?”
风曰:“然,予蓬蓬然起 于北海而入于南海也,然而指我则胜我,鰌我亦胜我。
虽然,夫折大 木,蜚大屋者,唯我能也。”
故以众小不胜为大胜也。为大胜者,唯 圣人能之。
庄子与惠子游于濠梁之上。庄子曰:“儵鱼出游从容,是鱼之乐也。”
惠子曰∶“子非鱼,安知鱼之乐?”庄子曰:“子非我,安知我不知 鱼之乐?”
惠子曰“我非子,固不知子矣;子固非鱼也,子之不知鱼 之乐,全矣!”
庄子曰:“请循其本。子曰‘汝安知鱼乐’云者,既 已知吾知之而问我。我知之濠上也。”