Machine learning for OpenCV 学习笔记 day4

独立成分分析(ICA)

其他与openCV中PCA算法类似的降维方式还有scikit-learn中的ICA。

from sklearn import decomposition

跟前面提到的一样,我们还是使用fit_transform 函数来训练模型。

ica = decomposition.FastICA()
X2 = ica.fit_transform(X)

然后我们就可以将输出结果可视化出来:

plt.figure(figsize=(10,6))
plt.plot(X2[:,0],X2[:,1],'o')
plt.xlabel('first principal component')
plt.ylabel('second principal component')
plt.axis([-0.2,0.2,-0.2,0.2])
plt.show()

输出结果为:
这里写图片描述

非负矩阵分解(NMF)

使用此方法唯一的限制是,数据矩阵中的元素都是非负的

nmf = decomposition.NMF()
X2 = nmf.fit_transform(X)

#可视化
plt.figure(figsize=(10,6))
plt.plot(X2[:,0],X2[:,1],'o')
plt.xlabel('first principal component')
plt.ylabel('second principal component')
plt.axis([0,7,0,15])
plt.show()

输出结果为:
这里写图片描述

表示类型变量

类型特征所带来的问题就是它们不是连续变化的,这就给数字表示变量带来了困难。例如一根香蕉不是绿的就是黄的,不可能两种都有;一个产品是属于服装部门还是属于书籍部门,但是很少同属于两个部门… 等等
首先以一些机器学习和人工智能的先辈们的信息为例,加入我们有如下信息:

data = [
    {'name':'Alan Turing','born':1912,'died':1954},
    {'name':'Herbert A.Simon','born':1916,'died':2001},
    {'name': 'Jacek Karpinski', 'born': 1927, 'died': 2010},
    {'name': 'J.C.R. Licklider', 'born': 1915, 'died': 1990},
    {'name': 'Marvin Minsky', 'born': 1927, 'died': 2016},
]

当我们想给以上信息编码时,若使用下面的方式好像是可行的,但是从机器学习的角度却不可行。

{'Alan Turing': 1,
 'Herbert A. Simon': 2,
 'Jacek Karpinsky': 3,
 'J.C.R. Licklider': 4,
 'Marvin Minsky': 5};

一种快速的方法就是使用sklearn中的DictVectorizer 也叫独热编码(one-hot encoding),使用方式就是将一个包含数据的字典输入到fit_transform() 里面

from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False, dtype=int)
vec.fit_transform(data)
# 显示出各数据对应的特征名称
print(vec.get_feature_names())

输出结果是:
这里写图片描述

所以第一行的意思可以理解为: ‘born’=1912, ‘died’=1954, ‘Alan Turing’=1, ‘Herbert A. Simon’=0, ‘J.C.R Licklider’=0, ‘Jacek Karpinsik’=0, and ‘Marvin Minsky’=0. 后面的数据以此类推。

表示文本特征

sample = [
    'feature engineering',
    'feature selection',
    'feature extraction'
]

想要给上面的文本信息打标签,最简单的方法就是使用单词序号编码,即给不同的单词表上序号,在sklearn中我们可以使用CountVectorizer 去实现它。

from sklearn import feature_extraction
vec=feature_extraction.text.CountVectorizer()
X=vec.fit_transform(sample)
print(X.toarray())
print(vec.get_feature_names())

默认X输出的是一个稀疏矩阵,我们 想很好的观察它需要将X转换成正常的矩阵,所以这里使用X.toarray() 函数来实现。我们依旧输出特征的名称:
这里写图片描述

但是这种方法的一个弊端就是我们可能会放太多的权重在出现频率高的单词上面,我们使用一种叫做 frequency-inverse document frequency(TF-IDF):

from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X = vec.fit_transform(sample)
X.toarray()

输出结果为:
这里写图片描述

表示图片

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值