机器学习之无监督学习:自组织映射SOM教程_第1页
机器学习之无监督学习:自组织映射SOM教程_第2页
机器学习之无监督学习:自组织映射SOM教程_第3页
机器学习之无监督学习:自组织映射SOM教程_第4页
机器学习之无监督学习:自组织映射SOM教程_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

机器学习之无监督学习:自组织映射SOM教程1机器学习:无监督学习:自组织映射SOM1.1简介1.1.1SOM的基本概念自组织映射(Self-OrganizingMap,SOM)是一种无监督学习的神经网络模型,由芬兰科学家TeuvoKohonen在1982年提出,因此也被称为Kohonen映射。SOM的主要功能是将高维输入数据映射到低维空间(通常是二维),同时保持输入数据的拓扑结构。这种映射使得数据的可视化和理解变得更为直观,特别适用于数据探索和聚类分析。1.1.1.1原理SOM的训练过程基于竞争学习(competitivelearning)。网络中的每个神经元都有一个权重向量,初始时这些权重向量是随机的。在训练过程中,输入数据被逐个呈现给网络,每个神经元计算其权重向量与输入数据之间的距离,距离最近的神经元(即获胜神经元)及其周围的神经元的权重向量会根据输入数据进行调整,使得它们更接近输入数据。这个过程会重复进行,直到权重向量稳定或达到预定的训练次数。1.1.1.2代码示例下面是一个使用Python和scikit-learn库的SOM实现示例。我们将使用一个简单的二维数据集来演示SOM的训练和可视化过程。importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearn.datasetsimportmake_blobs

fromminisomimportMiniSom

#生成数据

data,_=make_blobs(n_samples=100,centers=3,n_features=2,random_state=42)

#初始化SOM

som=MiniSom(x=10,y=10,input_len=2,sigma=1.0,learning_rate=0.5)

#训练SOM

som.train_random(data=data,num_iteration=100)

#获取每个神经元的获胜数据点

win_map=som.win_map(data)

#可视化SOM

plt.figure(figsize=(10,10))

forpositioninwin_map.keys():

plt.scatter(win_map[position][:,0],win_map[position][:,1],label='clusterforposition{}'.format(position))

plt.legend()

plt.show()在这个例子中,我们首先生成了一个包含100个样本的二维数据集,这些样本被分为3个中心。然后,我们初始化了一个10x10的SOM,输入维度为2。SOM通过train_random方法进行训练,训练次数为100次。最后,我们使用win_map方法来获取每个神经元的获胜数据点,并将其可视化,可以看到数据被聚类到SOM的不同位置上。1.1.2SOM的应用领域SOM在多个领域都有广泛的应用,包括但不限于:数据可视化:SOM可以将高维数据映射到二维或三维空间,便于数据的可视化和理解。聚类分析:SOM可以用于识别数据集中的自然聚类,帮助进行市场细分、客户分类等。模式识别:在图像和声音识别中,SOM可以用于识别和分类不同的模式。生物信息学:SOM可以用于分析基因表达数据,识别基因表达的模式。金融分析:在金融领域,SOM可以用于识别股票市场的模式,预测股票价格等。1.1.2.1实例描述例如,在生物信息学中,SOM可以用于分析大规模的基因表达数据。假设我们有一组基因表达数据,每个样本包含数千个基因的表达水平。通过使用SOM,我们可以将这些高维数据映射到二维空间,每个神经元代表一个基因表达模式。这样,我们就可以直观地看到哪些基因表达模式是相似的,哪些是不同的,从而帮助我们理解基因的功能和相互作用。1.2结束语SOM作为一种强大的无监督学习工具,不仅能够处理高维数据,还能保持数据的拓扑结构,使其在数据可视化和聚类分析中具有独特的优势。通过上述的原理介绍和代码示例,我们希望你能够对SOM有更深入的理解,并在实际项目中尝试应用它。2SOM的工作原理2.1神经元的初始化在自组织映射(SOM)中,神经元的初始化是构建网络的第一步。这通常涉及到为每个神经元分配一个随机权重向量,这些向量的维度与输入数据的特征维度相同。初始化的目的是为了给网络一个起点,以便它可以通过学习过程逐渐调整权重,最终形成对输入数据的有序表示。2.1.1示例代码importnumpyasnp

#假设我们有3个特征的输入数据

num_features=3

#创建一个3x3的SOM网格

num_neurons=3*3

weights=np.random.rand(num_neurons,num_features)

#打印初始化的权重矩阵

print("初始化的权重矩阵:")

print(weights)2.1.2解释上述代码中,我们首先导入了numpy库,用于进行数值计算。然后,我们定义了输入数据的特征数量为3。接下来,我们创建了一个3x3的SOM网格,这意味着我们有9个神经元。我们使用np.random.rand函数为每个神经元初始化一个随机权重向量,向量的长度等于特征数量。最后,我们打印出初始化的权重矩阵,以便观察。2.2竞争学习过程SOM的竞争学习过程是其核心机制,它通过比较输入向量与所有神经元的权重向量,找到与输入向量最相似的神经元,即“获胜神经元”。然后,根据邻域函数,调整获胜神经元及其邻近神经元的权重,使它们更接近输入向量。这个过程重复进行,直到网络权重稳定或达到预定的学习周期。2.2.1示例代码#假设我们有以下输入向量

input_vector=np.array([0.5,0.2,0.8])

#计算每个神经元与输入向量的距离

distances=np.linalg.norm(weights-input_vector,axis=1)

#找到距离最小的神经元(获胜神经元)

winner=np.argmin(distances)

#更新获胜神经元及其邻近神经元的权重

learning_rate=0.1

radius=1.0

foriinrange(num_neurons):

#计算神经元i与获胜神经元之间的距离

distance_to_winner=np.linalg.norm(np.array([i//3,i%3])-np.array([winner//3,winner%3]))

#如果神经元i在获胜神经元的邻域内

ifdistance_to_winner<=radius:

#更新权重

weights[i]+=learning_rate*(input_vector-weights[i])2.2.2解释在这个示例中,我们首先定义了一个输入向量input_vector。然后,我们计算了每个神经元的权重向量与输入向量之间的欧几里得距离,存储在distances数组中。通过np.argmin函数,我们找到了距离最小的神经元,即“获胜神经元”。接下来,我们定义了学习率learning_rate和邻域半径radius。对于SOM网格中的每个神经元,我们计算了它与获胜神经元之间的距离。如果神经元在获胜神经元的邻域内,我们根据学习率和输入向量与当前权重向量的差值来更新权重。2.3邻域函数与学习率的调整邻域函数定义了在竞争学习过程中,哪些神经元应该被更新以及更新的程度。通常,邻域函数会随着学习的进行而逐渐缩小,这意味着只有获胜神经元及其直接邻近的神经元会被更新,而远离获胜神经元的神经元则不会被影响。同时,学习率也会逐渐减小,以确保权重的调整更加精细,最终形成稳定的映射。2.3.1示例代码defneighborhood_function(distance,radius):

#高斯邻域函数

returnnp.exp(-(distance**2)/(2*(radius**2)))

#更新权重的函数

defupdate_weights(input_vector,weights,winner,learning_rate,radius):

foriinrange(num_neurons):

distance_to_winner=np.linalg.norm(np.array([i//3,i%3])-np.array([winner//3,winner%3]))

influence=neighborhood_function(distance_to_winner,radius)

weights[i]+=learning_rate*influence*(input_vector-weights[i])2.3.2解释neighborhood_function函数实现了高斯邻域函数,它根据神经元与获胜神经元之间的距离和当前的邻域半径来计算影响程度。update_weights函数则使用了这个邻域函数来更新权重。对于每个神经元,我们计算了它与获胜神经元之间的距离,然后使用邻域函数计算影响程度。权重的更新量等于学习率乘以影响程度,再乘以输入向量与当前权重向量的差值。这样,只有在邻域内的神经元才会被显著更新,而远离获胜神经元的神经元则几乎不会改变。通过上述代码示例,我们可以看到SOM是如何通过初始化权重、竞争学习过程以及邻域函数和学习率的调整来实现对输入数据的自组织映射的。这些步骤共同作用,使SOM能够从无序的输入数据中学习到有序的特征表示,从而在数据可视化和聚类等任务中发挥重要作用。3SOM的训练过程3.1数据预处理数据预处理是自组织映射(SOM)训练前的关键步骤,确保数据的格式和质量适合算法的输入要求。预处理通常包括数据清洗、标准化和降维等操作。3.1.1数据清洗数据清洗涉及去除或修正数据集中的错误、不完整、不准确或不相关的部分。例如,处理缺失值、异常值和重复数据。3.1.2标准化由于SOM对输入数据的尺度敏感,因此需要对数据进行标准化,使所有特征具有相同的权重。常用的方法有最小-最大缩放和Z-score标准化。3.1.2.1示例代码:Z-score标准化importnumpyasnp

fromsklearn.preprocessingimportStandardScaler

#假设我们有以下数据

data=np.array([[1,2],[3,4],[5,6],[7,8]])

#创建StandardScaler对象

scaler=StandardScaler()

#拟合并转换数据

data_scaled=scaler.fit_transform(data)

#输出标准化后的数据

print(data_scaled)3.1.3降维虽然SOM可以处理高维数据,但在某些情况下,降维可以提高训练效率和模型性能。PCA是常用的降维技术。3.2确定SOM的大小和形状SOM的大小和形状直接影响其性能和结果的解释。通常,SOM的大小应根据数据集的复杂性和特征空间的维度来选择。形状可以是矩形或六边形,六边形在处理高维数据时可能更有效。3.2.1选择SOM的大小一个常见的方法是将SOM的大小设置为数据集特征数量的平方根。3.2.2选择SOM的形状矩形网格简单且直观,而六边形网格可以提供更紧密的邻居关系,适用于复杂的数据集。3.3训练SOM网络训练SOM网络涉及将输入数据映射到SOM的神经元上,通过迭代更新神经元的权重,使它们更好地表示数据集的特征空间。3.3.1算法步骤初始化权重。选择一个输入样本。找到与输入样本最相似的神经元(BMU)。更新BMU及其邻居的权重。重复步骤2-4,直到满足停止条件。3.3.1.1示例代码:使用Python的SOM库训练SOMfromminisomimportMiniSom

importnumpyasnp

#假设我们有以下标准化后的数据

data=np.array([[0,0],[0,1],[1,0],[1,1]])

#初始化SOM

som=MiniSom(x=2,y=2,input_len=2,sigma=1.0,learning_rate=0.5)

#训练SOM

som.train_random(data=data,num_iteration=100)

#获取训练后的权重

weights=som.get_weights()

print(weights)3.4评估SOM的收敛性评估SOM的收敛性是确保模型有效表示数据集特征空间的重要步骤。常用的方法包括计算量化误差和拓扑误差。3.4.1量化误差量化误差衡量输入数据与SOM中代表它们的神经元之间的平均距离。较低的量化误差表示SOM更好地拟合了数据。3.4.2拓扑误差拓扑误差衡量输入数据是否被映射到其最近的神经元或其直接邻居上。较低的拓扑误差表示SOM保持了数据的拓扑结构。3.4.2.1示例代码:计算量化误差和拓扑误差fromminisomimportMiniSom

importnumpyasnp

#假设我们有以下标准化后的数据

data=np.array([[0,0],[0,1],[1,0],[1,1]])

#初始化并训练SOM

som=MiniSom(x=2,y=2,input_len=2,sigma=1.0,learning_rate=0.5)

som.train_random(data=data,num_iteration=100)

#计算量化误差

quantization_error=som.quantization_error(data)

print(f"QuantizationError:{quantization_error}")

#计算拓扑误差

topographic_error=som.topographic_error(data)

print(f"TopographicError:{topographic_error}")通过以上步骤,我们可以有效地训练和评估SOM模型,使其成为无监督学习中探索和可视化高维数据的强大工具。4SOM的实例分析4.1使用SOM进行客户细分自组织映射(Self-OrganizingMap,SOM)是一种无监督学习技术,特别适用于高维数据的可视化和降维。在客户细分中,SOM可以帮助我们理解客户群的结构,识别不同类型的客户,从而制定更有效的市场策略。4.1.1示例:基于购买行为的客户细分假设我们有一家电子商务公司,收集了客户的购买历史数据,包括购买频率、购买金额和购买时间。我们想要使用SOM来识别不同的客户类型。4.1.1.1数据准备数据集包含以下字段:-purchase_frequency:购买频率-purchase_amount:购买金额-purchase_time:购买时间(标准化为一天中的小时数)importpandasaspd

importnumpyasnp

fromminisomimportMiniSom

#创建示例数据

data={

'purchase_frequency':[10,5,20,15,12,8,18,14],

'purchase_amount':[200,150,300,250,220,120,280,230],

'purchase_time':[12,18,10,14,16,9,11,15]

}

df=pd.DataFrame(data)4.1.1.2训练SOM#初始化SOM

som=MiniSom(x=2,y=2,input_len=3,sigma=1.0,learning_rate=0.5)

#训练SOM

data_normalized=df.values/np.max(df.values,axis=0)

som.train_random(data=data_normalized,num_iteration=100)4.1.1.3客户映射#将客户映射到SOM上

mapped=np.array([som.winner(x)forxindata_normalized])

#打印每个客户映射到的SOM位置

fori,minenumerate(mapped):

print(f"客户{i+1}映射到位置:{m}")4.2SOM在图像识别中的应用SOM在图像识别中可以用于特征提取和模式识别,通过将高维图像数据映射到低维空间,帮助我们理解图像的结构和相似性。4.2.1示例:手写数字识别假设我们有一组手写数字的图像数据,我们想要使用SOM来识别和分类这些数字。4.2.1.1数据准备使用MNIST数据集,这是一个常用的手写数字图像数据集。fromkeras.datasetsimportmnist

#加载MNIST数据集

(X_train,y_train),(X_test,y_test)=mnist.load_data()

#选择前1000个样本进行处理

X=X_train[:1000]/255.0

X=X.reshape(X.shape[0],X.shape[1]*X.shape[2])4.2.1.2训练SOM#初始化SOM

som=MiniSom(x=10,y=10,input_len=X.shape[1],sigma=1.0,learning_rate=0.5)

#训练SOM

som.train_random(data=X,num_iteration=1000)4.2.1.3图像映射#将图像映射到SOM上

mapped=np.array([som.winner(x)forxinX])

#打印每个图像映射到的SOM位置

fori,minenumerate(mapped):

print(f"图像{i+1}映射到位置:{m}")4.3SOM在生物信息学中的应用在生物信息学领域,SOM可以用于基因表达数据的分析,帮助识别基因表达模式和生物样本的分类。4.3.1示例:基因表达数据的模式识别假设我们有一组基因表达数据,我们想要使用SOM来识别不同样本中的基因表达模式。4.3.1.1数据准备数据集包含以下字段:-gene_expression_1:基因1的表达水平-gene_expression_2:基因2的表达水平-gene_expression_3:基因3的表达水平#创建示例数据

data={

'gene_expression_1':[1.2,0.8,1.5,1.0,1.3,0.9,1.4,1.1],

'gene_expression_2':[0.5,0.3,0.7,0.4,0.6,0.2,0.8,0.4],

'gene_expression_3':[2.0,1.5,2.5,1.8,2.2,1.6,2.4,1.9]

}

df=pd.DataFrame(data)4.3.1.2训练SOM#初始化SOM

som=MiniSom(x=3,y=3,input_len=3,sigma=1.0,learning_rate=0.5)

#训练SOM

data_normalized=df.values/np.max(df.values,axis=0)

som.train_random(data=data_normalized,num_iteration=100)4.3.1.3基因表达模式映射#将基因表达数据映射到SOM上

mapped=np.array([som.winner(x)forxindata_normalized])

#打印每个样本映射到的SOM位置

fori,minenumerate(mapped):

print(f"样本{i+1}映射到位置:{m}")通过上述示例,我们可以看到SOM在不同领域的应用,包括客户细分、图像识别和生物信息学中的基因表达模式识别。SOM通过无监督学习的方式,帮助我们从高维数据中发现结构和模式,为数据分析和决策提供支持。5SOM的优化与改进5.1参数选择的技巧在自组织映射(SOM)中,参数的选择对模型的性能和收敛速度有着直接的影响。以下是一些关键参数的选择技巧:5.1.1网络尺寸SOM网络的尺寸(即神经元的数量)应根据数据集的复杂性和特征空间的维度来选择。一个常见的做法是,网络的尺寸应至少是数据特征维度的平方根。5.1.2学习率学习率决定了权重更新的幅度。初始学习率通常设置得较高,然后随着迭代次数的增加而逐渐减小。这可以通过以下公式实现:η其中,η0是初始学习率,t是当前迭代次数,τ5.1.3邻域函数邻域函数决定了获胜神经元的邻域内其他神经元的权重更新程度。邻域函数的宽度(即影响范围)也应随迭代次数增加而减小。5.1.4代码示例以下是一个使用Python和minisom库实现SOM的示例,展示了如何设置这些参数:#导入所需库

importnumpyasnp

fromminisomimportMiniSom

#数据准备

data=np.array([[1.0,2.0],[1.5,2.5],[1.2,2.2],[6.0,7.0],[6.5,7.5],[6.2,7.2]])

#设置SOM参数

som=MiniSom(x=2,y=1,input_len=2,sigma=1.0,learning_rate=0.5)

#初始化权重

som.random_weights_init(data)

#训练SOM

som.train_random(data=data,num_iteration=100)

#输出训练后的权重

print(som.get_weights())5.1.5训练迭代次数迭代次数应足够多以确保网络收敛,但过多的迭代会增加计算成本。通常,迭代次数可以设置为数据集大小的10到100倍。5.2SOM的变种介绍5.2.1GrowingSOMGrowingSOM是一种动态调整网络尺寸的SOM变种。它从一个较小的网络开始,然后根据数据的分布动态增加神经元的数量,以更好地适应数据的复杂性。5.2.2BatchSOM与标准SOM逐个更新权重不同,BatchSOM在每个迭代中使用整个数据集来更新权重,这可以提高训练的稳定性和效率。5.2.3ProbabilisticSOMProbabilisticSOM引入了概率论的概念,使得每个输入向量被映射到多个神经元的概率上,而不仅仅是单一的获胜神经元。5.3结合其他机器学习算法的SOM应用5.3.1SOM与聚类算法结合SOM可以作为预处理步骤,用于降维和数据可视化,之后可以应用如K-means等聚类算法对SOM的输出进行进一步分析。5.3.2代码示例以下是一个使用SOM进行数据降维,然后应用K-means进行聚类的Python示例:#导入所需库

fromsklearn.clusterimportKMeans

importnumpyasnp

fromminisomimportMiniSom

#数据准备

data=np.random.rand(100,10)

#使用SOM进行降维

som=MiniSom(x=10,y=10,input_len=10,sigma=1.0,learning_rate=0.5)

som.random_weights_init(data)

som.train_random(data=data,num_iteration=100)

#获取SOM的输出

output_grid=som.get_weights()

#将SOM的输出扁平化为一维数组,以便应用K-means

flattened_grid=np.reshape(output_grid,(output_grid.shape[0]*output_grid.shape[1],output_grid.shape[2]))

#应用K-means聚类

kmeans=KMeans(n_clusters=5)

kmeans.fit(flattened_grid)

#输出聚类结果

print(kmeans.labels_)5.3.3SOM与深度学习结合SOM可以用于深度学习模型的预训练,帮助模型学习数据的特征表示。例如,在卷积神经网络(CNN)中,SOM可以用于初始化网络的权重,从而加速训练过程。5.3.4SOM与强化学习结合在强化学习中,SOM可以用于状态空间的降维,使得强化学习算法能够更有效地探索和学习。通过将高维状态映射到SOM的低维网格上,可以简化状态表示,减少学习的复杂性。通过上述技巧和变种,SOM可以被优化和改进,以适应更广泛的应用场景,提高其在无监督学习任务中的性能和效率。6SOM的实践与代码实现6.11Python中SOM的实现在Python中实现自组织映射(SOM),我们通常会使用minisom库,这是一个轻量级且易于使用的SOM实现库。下面我们将通过一个具体的例子来展示如何使用minisom库在Python中构建和训练一个SOM。6.1.1数据准备假设我们有一组客户数据,我们想要通过SOM来发现客户之间的模式和关系。数据集包含客户的年龄、收入和消费水平。importnumpyasnp

#示例数据

data=np.array([[30,50000,1500],

[45,70000,2000],

[25,40000,1000],

[35,60000,1800],

[40,80000,2500]])6.1.2构建SOM接下来,我们将使用minisom库来构建一个SOM。我们将创建一个5x5的网格,并设置训练迭代次数。fromminisomimportMiniSom

#初始化SOM

som=MiniSom(5,5,3,sigma=1.0,learning_rate=0.5)

som.random_weights_init(data)

som.train_random(data,100)6.1.3训练SOM使用train_random方法,我们可以随机选择数据点来训练SOM。在这个例子中,我们将进行100次迭代。6.1.4映射数据训练完成后,我们可以将原始数据映射到SOM的网格上,以查看每个数据点的归属。mapped=som.win_map(data)6.1.5结果分析通过分析mapped结果,我们可以发现数据点在SOM网格上的分布,从而揭示客户之间的潜在模式。6.22SOM在R语言中的应用在R语言中,我们可以使用kohonen包来实现SOM。下面是一个使用R语言构建和训练SOM的示例。6.2.1安装和加载包首先,我们需要安装并加载kohonen包。install.packages("kohonen")

library(kohonen)6.2.2数据准备我们使用与Python示例相同的数据集。data<-matrix(c(30,50000,1500,

45,70000,2000,

25,40000,1000,

35,60000,1800,

40,80000,2500),ncol=3,byrow=TRUE)6.2.3构建SOM接下来,我们创建一个SOM模型,并设置其参数。#初始化SOM

som<-som(data,grid=somgrid(5,5,"hexagonal"))6.2.4训练SOM使用som函数,我们已经初始化并训练了SOM模型。6.2.5映射数据训练完成后,我们可以使用predict函数来映射数据点到SOM网格上。#映射数据

mapped<-predict(som,data)6.2.6结果分析通过分析mapped结果,我们可以观察到数据点在SOM网格上的分布,从而发现数据中的模式。6.33SOM的可视化工具介绍可视化是理解SOM结果的关键。在Python中,我们可以使用matplotlib库来可视化SOM的网格和数据点的分布。在R语言中,kohonen包本身就提供了可视化功能。6.3.1Python中的可视化使用matplotlib库,我们可以绘制SOM的网格和数据点的分布。importmatplotlib.pyplotasplt

#绘制SOM网格

plt.figure(figsize=(8,8))

fori,xinenumerate(data):

w=som.winner(x)

plt.text(w[1]+.5,w[0]+.5,i,color=plt.cm.rainbow(i/np.max(data.shape[0])),

fontdict={'weight':'bold','size':11})

plt.axis('off')

plt.show()6.3.2R语言中的可视化在R中,我们可以直接使用kohonen包的可视化功能。#可视化SOM

plot(som,type="mapping")通过这些可视化工具,我们可以更直观地理解SOM模型如何对数据进行分类和聚类。7总结与展望7.11SOM的学习要点回顾自组织映射(Self-OrganizingMap,SOM)是一种无监督学习技术,由芬兰科学家TeuvoKohonen在1982年提出,因此也被称为Kohonen网络。SOM将高维输入数据映射到低维(通常是二维)空间,同时保持输入数据的拓扑结构。这一特性使得SOM在数据可视化、聚类分析、特征映射等方面有广泛应用。7.1.1原理SOM的学习过程基于竞争学习原则。网络中的神经元与输入数据进行竞争,获胜的神经元(即与输入数据最相似的神经元)将被调整以更接近输入数据。同时,获胜神经元的邻居也会被调整,但调整的幅度会根据它们与获胜神经元的距离而递减。这一过程重复进行,直到网络稳定或达到预定的学习周期。7.1.2代码示例下面是一个使用Python和scikit-learn库实现SOM的简单示例。我们将使用Iris数据集进行演示。#导入所需库

importnumpyasnp

importmatplotlib.pyplotasplt

fromsklearnimportdatasets

fromsklearn.preprocessingimportMinMaxScaler

fromminisomimportMiniSom

#加载I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论