构建共线矩阵的两种惊艳操作

本文介绍了如何使用Python高效地构建IPC共线网络的矩阵,并通过简洁的代码实现上三角矩阵的提取,展示了Python在矩阵操作中的语法糖优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔者要做的事情是利用专利的IPC信息构建IPC的共线网络,然后提取IPC的节点特征
原本我构建IPC共线矩阵的函数代码是

def ipcCoocureMetrix(patentsIpc):
    '''构建ipc共线矩阵'''
    coIPCs = []    #所有专利的共线IPC(二维)
    IpcUnique = []    #所有IPC(一维)
    for i, IPCs in patentsIpc.items():
        onePatentIPC = IPCs.split(', ')
        coIPCs = coIPCs.append(onePatentIPC)
        IpcUnique.extend(onePatentIPC)
    
    IpcUnique = list(set(IpcUnique))    #去重后的IPC
    #IPC共现矩阵
    ipcCoMatirx = pd.DataFrame(np.zeros((len(IpcUnique
<think>我们正在处理用户关于构建IPC分类号共现矩阵的问题。根据引用[1]和[2],我们可以提供两种构建共现矩阵的方法,并进一步解释其应用。用户需求:构建或使用IPC分类号的共现矩阵根据引用[1]中的代码,构建共现矩阵的一种方法是:1.将每个专利的IPC分类号分割成列表。2.使用pandas的get_dummies函数进行独热编码,然后按行求和(每个专利的IPC出现情况)。3.通过矩阵转置和相乘得到共现矩阵(即任意两个IPC同时出现在同一专利的次数)。4.矩阵的下三角部分置零(保留上三角矩阵以避免重复)。5.将上三角矩阵转换为边列表(包含source,target,weight),用于构建网络图。引用[2]提到另一种方法:构建共现矩阵(IPC共同出现在同一专利为1,否则为0),然后利用图卷积网络(GCN)提取特征。下面我们将详细说明第一种方法(引用[1]的代码)的步骤,并给出第二种方法的简要说明。###方法1:构建共现矩阵并转换为网络图(引用[1])假设我们有一个专利数据集,其中每项专利有一个或多个IPC分类号,存储为逗号分隔的字符串。例如:专利1:"A01B,A01C,A01D"专利2:"A01B,A01C"步骤:1.将每个专利的IPC字符串分割成列表,得到所有专利的IPC列表(二维列表)。2.使用`pd.get_dummies`将每个专利的IPC列表转换为二进制向量(出现为1,否则为0)。注意,这里使用`prefix=''`和`prefix_sep=''`来保持列名为IPC代码本身。3.按行(每个专利)对相同的IPC列进行求和(实际上,由于每个专利中每个IPC只出现一次,求和结果也是0或1,但如果有重复,则可能大于1。通常一个专利中同一IPC不会重复,所以求和后还是0或1)。4.计算共现矩阵:将上一步得到的矩阵转置后与自身相乘(即`u.T.dot(u)`),得到一个对称矩阵,其中每个元素表示两个IPC共同出现的次数。5.矩阵的下三角(包括对角线)置零,只保留上三角部分(避免重复的边)。6.使用`stack`方法将上三角矩阵转换为长格式,即每一行是一个边(source,target,weight),其中weight是共现次数。7.使用`networkx`从边列表构建图。代码示例(基于引用[1]并稍作调整):```pythonimportpandasaspdimportnumpyasnpimportnetworkxasnxdefbuild_cooccurrence_matrix(patentsIpc):"""专利IPC共现矩阵构建与网络图生成:parampatentsIpc:一个Series或字典,key为专利ID,value为IPC字符串(多个IPC用逗号分隔):return:网络图G"""coIPCs=[]#所有专利的IPC列表(二维)foripcsinpatentsIpc:#假设每个专利的IPC字符串用逗号分隔,去除可能的多余空格onePatentIPC=[ipc.strip()foripcinipcs.split(',')]coIPCs.append(onePatentIPC)#构建独热编码矩阵,每个IPC作为一列,每行是一个专利的IPC出现情况#使用get_dummies,然后按行(每个专利)对相同的列(IPC)进行合并(求和)#注意:这里使用prefix=''和prefix_sep='',使得列名就是IPC代码df_dummies=pd.get_dummies(pd.DataFrame(coIPCs),prefix='',prefix_sep='').sum(level=0,axis=1)#计算共现矩阵:转置后点乘自身v=df_dummies.T.dot(df_dummies)#将下三角矩阵(包括对角线)置0,只保留上三角部分#这样避免无向图中的重复边v.values[np.tril_indices_from(v,k=0)]=0#将上三角矩阵转换为边列表edges=v.stack().reset_index()edges.columns=['source','target','weight']#去掉weight为0的边edges=edges[edges['weight']>0]#构建图G=nx.from_pandas_edgelist(edges,source='source',target='target',edge_attr='weight')#添加孤立的IPC节点(那些只出现在一个专利中且没有与其他IPC共现的)#注意:上面的共现矩阵只统计了共现关系,所以没有共现的IPC不会出现在边列表中#遍历所有专利的第一个IPC(主IPC)作为节点,如果不在图中则添加#注意:这里也可以考虑添加所有出现过的IPC,但引用[1]只添加了主IPC。根据实际需求调整。all_ipcs=set([ipcforipc_listincoIPCsforipcinipc_list])foripcinall_ipcs:ifipcnotinG:G.add_node(ipc)returnG```注意:引用[1]中只添加了每个专利的第一个IPC(主IPC)作为孤立节点。这里我们修改为添加所有出现过的IPC(因为共现矩阵中已经包含了所有IPC作为列,但在构建图时,只有有边的节点才会被加入,所以需要单独添加没有边的节点)。###方法2:构建二元共现矩阵(引用[2])二元共现矩阵是指,如果两个IPC出现在同一专利中,则矩阵对应位置为1,否则为0。这种矩阵通常用于后续的图神经网络(如GCN)特征提取。构建步骤:1.与方法1类似,得到每个专利的IPC列表。2.构建一个空矩阵,行和列都是所有IPC代码(索引)。3.对于每个专利,将其包含的所有IPC两两配对(不重复),在矩阵对应位置加1(或者直接设为1,如果只关心是否共现而不关心次数)。4.注意,这里得到的矩阵是对称矩阵,对角线通常设为0(IPC不与自身共现)或者保留(表示该IPC出现的次数)。二元共现矩阵构建代码(简化):```pythonfromitertoolsimportcombinationsdefbuild_binary_cooccurrence(ipc_lists):#获取所有IPCall_ipcs=sorted(set(ipcforipc_listinipc_listsforipcinipc_list))#创建空矩阵co_matrix=pd.DataFrame(0,index=all_ipcs,columns=all_ipcs)#遍历每个专利的IPC列表foripc_listinipc_lists:#生成两两组合(不重复)foripc1,ipc2incombinations(ipc_list,2):#因为组合是无序的,所以我们需要在矩阵的两个位置都加1?但矩阵是对称的,所以只需要加一次。#注意:这里我们使用二元共现,所以直接设为1(如果已经为1则不变)#但为了记录共现次数,也可以累加。这里根据需求,如果只关心是否共现,则设为1;否则累加。co_matrix.loc[ipc1,ipc2]=1co_matrix.loc[ipc2,ipc1]=1#对称矩阵#或者我们也可以不设置对称,只使用上三角,但通常整个矩阵都会用。returnco_matrix```但是,如果使用累加的方式,则与方法1得到的共现矩阵(次数)类似,只是方法1是通过矩阵乘法得到的,效率更高。###使用场景(引用[3])引用[3]提到,通过分析IPC分类号及其技术主题的专利申请数量,可以了解技术发展方向。共现矩阵可以用于:-构建IPC共现网络,分析IPC之间的技术关联。-识别技术热点(高频IPC)和技术集群(共现密切的IPC组)。-通过图算法(如社区检测)发现技术子领域。###相关问题§§相关问题§§1.如何利用IPC共现矩阵进行技术主题分析?2.除了networkx,还有哪些工具可以分析共现矩阵?3.如何优化共现矩阵构建效率(特别是当专利数量很大时)?4.共现矩阵在专利分析中有哪些具体应用案例?</think>### IPC分类号共现矩阵构建方法 #### 1. 数据预处理 首先需要整理专利数据中的IPC分类号。假设原始数据格式为: ```python patentsIpc = { "专利1": "H01L 27/00, H01L 29/00, G06F 15/00", "专利2": "H01L 29/00, G06F 15/00", ... } ``` 将每个专利的IPC分类号转换为列表格式: ```python coIPCs = [] for IPCs in patentsIpc.values(): onePatentIPC = IPCs.split(', ') # 分割字符串 coIPCs.append(onePatentIPC) # 得到二维列表 ``` #### 2. 构建共现矩阵(核心步骤) 使用独热编码和矩阵乘法: ```python import pandas as pd import numpy as np # 创建独热编码矩阵 u = pd.get_dummies( pd.DataFrame(coIPCs), # 转换为DataFrame prefix='', prefix_sep='' ).sum(level=0, axis=1) # 合并相同IPC列 # 计算共现矩阵 (核心公式) v = u.T.dot(u) # 矩阵乘法: Uᵀ × U ``` 此时`v`是对称矩阵,其中`v[i,j]`表示IPC_i和IPC_j共同出现的专利数量。 #### 3. 矩阵优化处理 ```python # 保留上三角矩阵 (避免重复) v.values[np.tril_indices_from(v, k=0)] = 0 # 转换为边列表 edges = v.stack().reset_index() edges.columns = ['source', 'target', 'weight'] edges = edges[edges['weight'] > 0] # 过滤零值 ``` #### 4. 可视化与应用 ```python import networkx as nx # 构建共现网络图 G = nx.from_pandas_edgelist(edges, source='source', target='target', edge_attr='weight') # 添加孤立节点 (未共现的IPC) all_ipcs = set(ipc for sublist in coIPCs for ipc in sublist) G.add_nodes_from(all_ipcs - set(G.nodes)) ``` ### 应用场景 1. **技术关联分析** 共现矩阵可识别技术领域的关联性,例如`H01L 29/00`和`G06F 15/00`频繁共现表明半导体与计算技术的交叉创新[^3]。 2. **技术路线图绘制** 通过共现网络中心性分析,可识别核心IPC分类号(如燃料电池、固态电池等新能源汽车关键技术[^3])。 3. **专利布局优化** 矩阵中的密集区块反映技术热点,稀疏区域指示创新机会点(如`B60L 53/00`电动汽车充电技术)。 4. **GCN特征提取** 共现矩阵可作为图卷积网络(GCN)的输入,预测技术融合趋势[^2]。 ### 示例输出 共现矩阵片段: ``` H01L27/00 H01L29/00 G06F15/00 H01L27/00 0 2 1 H01L29/00 0 0 3 G06F15/00 0 0 0 ``` 对应网络图包含: - 边:`(H01L29/00, G06F15/00, weight=3)` - 节点:所有IPC分类号 ### 注意事项 1. IPC清洗:需统一格式(如去除`/`后多余空格) 2. 矩阵对称性:上三角处理避免重复计数 3. 权重阈值:过滤低频共现(如`weight<2`) 4. 多层级分析:可针对IPC主组(前4位)或小组(完整代码)分别构建
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值