毛俊杰,代码详解:用Python构建邻域矩阵,2元错版币

频道:新闻世界 日期: 浏览:156


全文共1522字,估计学习时长3分钟



怎么构建邻域矩阵?只把握理论知识,很难让人深化地了解这一问题。


本文咱们以这样一个模型为例:


\tilde{Y} = W \cdot YY~=W⋅Y


其间W是一个矩阵,能够界说为(例如):


w_{ij} = 1wij=1


当j在最接近i的K内,Wij=1,不然效果为0。


下面,咱们将具体介绍经过运用numpy、scipy和matplotlib进行可视化来创立W矩阵的办法。


样本数据


为到达演示意图,咱们创立了一个虚拟数据集,巨细为N = 12个练习样本,M = 3个测验样本:


import numpy as np

XY_train = np.array([[1.07712572, 0.50598419], [1.40709049, 1.29030559], [0.55806126, 1.23385926], [-0.92287428, 0.50598419], [-0.59290951, 1.29030559], [-1.44193874, 1.23385926], [-0.922874毛豪杰,代码详解:用Python构建邻域矩阵,2元错版币28, -1.49401581], [-0.59290951, -0.70969441], [-1.44193874, -0.76614074], [1.07712572, -1.49401581], [1.40709049, -0.70969441], [0.55806126, -0.76614074]])

XY_test = np.array([[1, 1], [-1, 1], [-1, -1], [1, -1]])


让咱们来看看这些点的散布状况:红点是练习数据,而绿点是测验数据。



寻觅邻域


用现代东西寻觅邻域是十分简略的。在这儿,咱们挑选运用scipy,由于稍后将运用这个软件包中的其他东西,但sklearn或其他软件包也能够完结这项作业。运用scipy时,首要运用练习数据集创立一个cKDTree:


from scipy.spatial import cKDTree

tree = cKDTree(XY_train)


可再次查询该tree:


K = 3

result = tree.query(XY_test, k=K)


在这儿,咱们需求测验样本元素中练习样本的三个最近邻域。默许状况下,tree.query回来邻域索引和相关间隔。咱们将保存两者。


distances, indices = result


让咱们会集评论索引数组。


array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])


索引数组是一个numpy数组,包括M(测验样本数)行和K(邻域数)列。那么怎么将其转换为咱们需求的矩阵呢?示例如下:


在一个情节中看到所选邻域会很风趣:


import matplotlib.pyplot as plt

n = 0 # first element in the test dataset

xy_test = XY_test[n]

index = indices[n]

neighbours = XY_train[index]

plt.clf()

plt.scatter(xy_test[0], xy_test[1], color="red")

plt.scatter(neighbours[:,0], neighbours[:,1], color="blue")

plt.xlabel("x")

plt.ylabel(毛豪杰,代码详解:用Python构建邻域矩阵,2元错版币"y")

plt.xlim(-2, 2)

plt.ylim(-2, 2)

plt.show()



好吧,所以邻域的寻觅好像和预期的相同有用!让咱们了解怎么将索引数组转换为彻底可用的矩阵,咱们的意图应该是:


1  1  1  0  0  0  0  0  0  0  0  0

0  0  0  1  1  1  0  0  0 &nb美树林地板sp;0  0  0

0  0  0  0  0  0  1  1  1  0  0  0

0  0  0  0  0  0  0  0  0  1  1 &nbs尸音p;1


由于测验调查0(榜首行)的邻域是练习调查0,1和2,毛豪杰,代码详解:用Python构建邻域矩阵,2元错版币所以测验毛豪杰,代码详解:用Python构建邻域矩阵,2元错版币调查1(第二行)的邻域是练习观测3,4和5,依此类推。


创立矩阵


首要,咱们将运用numpy索引创立这样的矩阵:



import numpy 炝柿子as np

a = np.array([1, 2, 3, 4, 5, 6])

i = [0, 0, 1, 1, 2, 2]

a[i]

# array([1, 1, 2, 2, 3, 3])


但你会发现它不适用于多维度数组。


咱们挑选的解决方案是运用scipy稀少矩阵,其可在索引列表中创立。例如,运用稀少矩阵创立巨细为N = 4的对角矩阵,能够表明为:


from scipy import sparse

i_index = [0, 1, 2, 3]

j_index = [0, 1, 2, 3]

values上文众申 = [1, 1, 1, 1]

matrix = sparse.coo_matrix((values, (i_index, j_index)), shape=(4, 4))

print(matrix)

# (0, 0)1

# (1, 1)1

# (2, 2)1

# 人形恶屌(3, 3)1


因而scipy获取i_index和j_index数组的榜首个元素i和j,并将values数组的榜首个元素放在终究矩阵中的[i,j]方位。或许换句话说,元素(0,皮德尔0)的值是1,元迪斯菲丽素(1,1)的值也是1 ...... 其他未特别阐明的元素的值都是零。


假如你更喜爱数组表明,能够输入以下代码检查效果:


matrix.toarray() # transforms sparse matrix into numpy array just for visualization

#array([[1, 0, 0, 0],

# [0, 1, 0, 0],

# [0, 0, 1, 0],

# [0, 0, 0, 1]])


这儿你能够看到对角线矩阵。


让咱们用第二个例子来更清楚地阐明全部。现在要创立的是逆对角矩阵:


array([[0, 0, 0, 1], [0, 0, 1, 0], [0, 1, 0小bb, 0], [1, 0, 0, 0]])


此次女人性的编码是:


i_index = [3, 2, 1, 0] # <== this is the only change with respect to previous ex油缸管ample!

j_index = [0, 1, 2, 3]

values = 索星金服[1, 1, 1, 1]

matrix = sparse.coo_matrix((values, (i_index, j_index)), shape=(4, 4))


留意:只有当矩阵规划相对较小时偷丝袜才能从稀少表明切换到密布表明,不然会呈现内存问题(稀少矩阵存在的原因!)


怎么创立W矩阵?


关于w矩阵,j_index(即“列”)对应相邻索引:


j_index = indices.flatten()

#array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])


然后走索引i_index&n禾念读什么bsp;对应测验样本中的索引,但需求重复K次以匹配j_index 排序:


i_index = np.repeat(np.array(range(M), dtype=int), repeats=K, axis=0).ravel()

#array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3])


这意味着在榜首行(行索引0)的0、1和2列将有一个索引。在第二行(1)的第3、4、5列中会有一个索引……假如你王希克再次检查测验/练习样本方位(榜首个图),效果是共同毛豪杰,代码详解:用Python构建邻域矩阵,2元错版币的!


我毛豪杰,代码详解:用Python构建邻域矩阵,2元错版币们假定一切值为“1”:


values = np.ones(M * K) # M = number of test sample, K = number of neighbours


或许用取决于间隔的函数表明,例如:


values = 1. / distances.flatten()**2


最终,我带鱼孩子刷爆网络们的矩阵看起来像(值为“1”):


matrix = sparse.coo_matrix((values, (i_index, j_in毛豪杰,代码详解:用Python构建邻域矩阵,2元错版币dex)), shape=(M, N))

# array([[1., 1.,德堡保险柜 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],

# [0., 0., 0., 1., 1., 1., 0., 0., 0., 0., 0., 0.],

# [0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 0.,双血缘是什么意思 0.],

# [0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1.]])


回到咱们开始的问题


现在,咱们能够核算点积(运用稀少或密布矩阵战地4上海之围宣传片):


y_tilde = matrix.dot(y) # where y has shape (N, )


最终,问题解决啦!


留言 点赞 发个朋友圈

咱们一同共享AI学习与开展的干货


编译组:王玲、狄思云

相关链接:

https:/临武瓜贩事情/stellasia.github.io/blog/2018-11-01-building-a-neighbour-matrix-with-python/

 

如需转载,请后台留言,恪守转载标准


引荐文章阅览


EMNLP2017论文集28篇论文解读

2018年AI三大顶会中国学术效果全链接

ACL2017 论文集:34篇解读干货全在这儿

10篇AAAI2017经典论文回忆


长按辨认二维码可增加重视

读芯君爱你