自然语言处理真实项目实战(20170822) (4)

K-Means算法是常用的聚类算法,但其算法本身存在一定的问题,例如在大数据量下的计算时间过长就是一个重要问题。为此,Mini Batch K-Means,这个基于K-Means的变种聚类算法应运而生。

Mini Batch K-Means

from sklearn.cluster import MiniBatchKMeans X_km_norm = [ unitvec(x) for x in X_km ] #转为单位向量 km_all = MiniBatchKMeans(n_clusters=8) #分为8个簇 km_all.fit(X_km_norm) #计算8个簇的质心

fit(X, y=None)
Compute the centroids on X by chunking it into mini-batches.
fit拟合操作,实际上就是计算每个簇的质心。
所以说,如果簇只有一个的话,拟合的意义是求出整个数据的质心。
predict(X)
Predict the closest cluster each sample in X belongs to.
predict预测操作,是给出每个样本属于哪个簇的结果

训练样本的分类和整理

项目中将所有样本按照时间分为:1年期样本和3年期样本。同时根据其他业务规则进行了分类(分类规则需要保密)。由于收集样本的渠道不同(不同的公司,组织提供的样本数据),所有的样本还需要进行Remove Common Factor的操作:
1.样本的分类并没有按照渠道进行分类,所以这里同一收集渠道的样本,也会被分在不同的类中
2.所有分类样本,例如1年期,3年期的样本,都必须进行Remove Common Factor
3.同一样本可能同时存在于不同分类组里面,因为有些是按照时间分类的,有些是按照业务分类的,分类的维度不同。

代码的逻辑如下:
fit:XX[tag]里面的tag表示收集渠道,XX[tag]表示某个渠道的样本矢量数组:
_cf[tag]:表示某个渠道的Common Factor矢量,这里使用np.array(XX[tag]).mean(axis=0)按列求均值获得的。每一个渠道有一个Common Factor矢量
remove代码则是将某个渠道里面所有的矢量,都剪去Common Factor矢量
(代码有删减,原来代码里面有对于未知渠道的防御代码,这里已经简化)

class CommonFactor(object): def __init__(self): self._cf = {} def fit(self, XX): for tag in XX: if XX[tag]: shape = XX[tag][0].shape self._cf[tag] = np.array(XX[tag]).mean(axis=0) return self def remove(self, XX): return dict([ (tag, [ x - self._cf[tag] for x in XX[tag] ]) for tag in XX ]) Python语言

推荐通过网络上的 廖雪锋的Python教程 学习python语法

numpy sum

axis:求和的维。

>>> np.sum([0.5, 1.5]) 2.0 >>> np.sum([0.5, 0.7, 0.2, 1.5], dtype=np.int32) 1 >>> np.sum([[0, 1], [0, 5]]) 6 >>> np.sum([[0, 1], [0, 5]], axis=0) array([0, 6]) >>> np.sum([[0, 1], [0, 5]], axis=1) array([1, 5]) numpy mean

axis:求平均的维。

>>> a = np.array([[1, 2], [3, 4]]) >>> np.mean(a) 2.5 >>> np.mean(a, axis=0) array([ 2., 3.]) >>> np.mean(a, axis=1) array([ 1.5, 3.5]) lambda 和浮点数

python中使用 .1 代表浮点数 0.1 或者 1. 代表浮点数 1.0。
原因是要保证结果的精度,防止程序自动强制转换。

score = lambda X, y: 1.-((y-X)**2).sum()/((y-y.mean())**2).sum() percentile

幾つかの数値データを小さい順に並べたとき、小さい方から数えて全体のX%に位置する値をXパーセンタイルと言います。
(数值按照从小到大进行排列,从小的数字开始计算,全体数字的X%的位置,数值是多少)

例えば10人のクラスがあるとして、各生徒のテストの点数が[40, 50, 60, 70, 75, 80, 83, 86, 89, 95]だったとします。
その時、下から95%に位置する点数(逆に言うと上位5%に位置する点数)が何点なのか示すものが95パーセンタイルになります。

以下、numpyを使ったサンプルです。

>>> import numpy as np >>> a = np.array([40, 50, 60, 70, 75, 80, 83, 86, 89, 95]) >>> np.percentile(a, 95) # 95パーセンタイルを求めます(逆に言うと上位5%に位置する点数) 92.299999999999997 # 95パーセンタイルは約92.3点であることがわかります >>> np.percentile(a, 30) # 30パーセンタイルを求めます(逆に言うと上位70%に位置する点数) 67.0 # 30パーセンタイルは67.0点であることがわかります 参考文档

数学之美:14章 余弦定理和新闻的分类 (吴军,第二版)
TF-IDF与余弦相似性的应用(一):自动提取关键词
TF-IDF与余弦相似性的应用(二):找出相似文章
Sentiment Analysis Using Doc2Vec
[Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型
【転職会議】クチコミをword2vecで自然言語処理して会社を分類してみる
适合大数据的聚类算法Mini Batch K-Means
K-means算法及文本聚类实践
パーセンタイルについて

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzjyd.html