(四)训练Part 1 zz

文本分类入门:特征提取与向量化表示
本文深入探讨了文本分类领域的基础知识,重点介绍了训练阶段如何通过特征提取和向量化表示方法,将文本数据转换为计算机可理解的形式。讨论了词典向量、TF-IDF权重、特征选择与降维的重要性,以及如何处理停止词和高维性问题,旨在提高分类准确性和效率。
部署运行你感兴趣的模型镜像

训练,顾名思义,就是training(汗,这解释),简单的说就是让计算机从给定的一堆文档中自己学习分类的规则(如果学不对的话,还要,打屁屁?)。

  开始训练之前,再多说几句关于VSM这种文档表示模型的话。

  举个例子,假设说把我正在写的“文本分类入门”系列文章的第二篇抽出来当作一个需要分类的文本,则可以用如下的向量来表示这个文本,以便于计算机理解和处理。

  w2=(文本,5,统计学习,4,模型,0,……)

  这个向量表示在w2所代表的文本中,“文本”这个词出现了5次(这个信息就叫做词频),“统计学习”这个词出现了4次,而“模型”这个词出现了0次,依此类推,后面的词没有列出。

  而系列的第三篇文章可以表示为

  w3=(文本,9,统计学习,4,模型,10,……)

  其含义同上。如果还有更多的文档需要表示,我们都可以使用这种方式。

  只通过观察w2和w3我们就可以看出实际上有更方便的表示文本向量的方法,那就是把所有文档都要用到的词从向量中抽离出来,形成共用的数据结构(也可以仍是向量的形式),这个数据结构就叫做词典,或者特征项集合。

  例如我们的问题就可以抽离出一个词典向量

  D=(文本,统计学习,模型,……)

  所有的文档向量均可在参考这个词典向量的基础上简化成诸如

  w2=(5,4,0,……)

  w3=(9,4,10,……)

  的形式,其含义没有改变。

  5,4,10这些数字分别叫做各个词在某个文档中的权重,实际上单单使用词频作为权重并不多见,也不十分有用,更常见的做法是使用地球人都知道的TF/IDF值作为权重。(关于TF/IDF的详细解释,Google的吴军研究员写了非常通俗易懂的文章,发布于Google黑板报,链接地址是http://googlechinablog.com/2006/06/blog-post_27.html,有兴趣不妨一读)TF/IDF作为一个词对所属文档主题的贡献程度来说,是非常重要的度量标准,也是将文档转化为向量表示过程中的重要一环。

  在这个转化过程中隐含了一个很严重的问题。注意看看词典向量D,你觉得它会有多大?或者说,你觉得它会包含多少个词?

  假设我们的系统仅仅处理汉语文本,如果不做任何处理,这个词典向量会包含汉语中所有的词汇,我手头有一本商务印书馆出版的《现代汉语词典》第5版(2005年5月出版),其中收录了65,000个词,D大致也应该有这么大,也就是说,D是一个65,000维的向量,而所有的文本向量w2,w3,wn也全都是65,000维的!(这是文本分类这一问题本身的一个特性,称为“高维性”)想一想,大部分文章仅仅千余字,包含的词至多几百,为了表示这样一个文本,却要使用65,000维的向量,这是对存储资源和计算能力多大的浪费呀!(这又是文本分类问题的另一个特性,称为“向量稀疏性”,后面会专门有一章讨论这些特性,并指出解决的方法,至少是努力的方向)

  中国是一个人口众多而资源稀少的国家,我们不提倡一味发展粗放型的经济,我们所需要的可持续发展是指资源消耗少,生产效率高,环境污染少……跑题了……

  这么多的词汇当中,诸如“体育”,“经济”,“金融”,“处理器”等等,都是极其能够代表文章主题的,但另外很多词,像“我们”,“在”,“事情”,“里面”等等,在任何主题的文章中都很常见,根本无法指望通过这些词来对文本类别的归属作个判断。这一事实首先引发了对文本进行被称为“去停止词”的预处理步骤(对英文来说还有词根还原,但这些与训练阶段无关,不赘述,会在以后讲述中英文文本分类方法区别的章节中讨论),与此同时,我们也从词典向量D中把这些词去掉。

  但经过停止词处理后剩下的词汇仍然太多,使用了太多的特征来表示文本,就是常说的特征集过大,不仅耗费计算资源,也因为会引起“过拟合问题”而影响分类效果[22]。

  这个问题是训练阶段要解决的第一个问题,即如何选取那些最具代表性的词汇(更严格的说法应该是,那些最具代表性的特征,为了便于理解,可以把特征暂时当成词汇来想象)。对这个问题的解决,有人叫它特征提取,也有人叫它降维。

  特征提取实际上有两大类方法。一类称为特征选择(Term Selection),指的是从原有的特征(那许多有用无用混在一起的词汇)中提取出少量的,具有代表性的特征,但特征的类型没有变化(原来是一堆词,特征提取后仍是一堆词,数量大大减少了而已)。另一类称为特征抽取(Term Extraction)的方法则有所不同,它从原有的特征中重构出新的特征(原来是一堆词,重构后变成了别的,例如LSI将其转为矩阵,文档生成模型将其转化为某个概率分布的一些参数),新的特征具有更强的代表性,并耗费更少的计算资源。(特征提取的各种算法会有专门章节讨论)

  训练阶段,计算机根据训练集中的文档,使用特征提取找出最具代表性的词典向量(仍然是不太严格的说法),然后参照这个词典向量把这些训练集文档转化为向量表示,之后的所有运算便都使用这些向量进行,不再理会原始的文本形式的文档了(换言之,失宠了,后后)。

  下一章继续训练,咱们之间还没完。(怎么听着像要找人寻仇似的)

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % PINN_RS_Main.m % 一键执行: % 1. 生成虚拟超声滚压残余应力数据 RS_dataset.csv % 2. 训练基于物理约束的PINN网络预测残余应力 % % 作者:GPT-5 (2025) % MATLAB 2022b+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear; clc; close all; %% ==================== PART 1 生成虚拟数据 ==================== disp('=== [1/4] Generating synthetic RS dataset ...'); pressureRange = [300 1500]; % N feedRateRange = [0.06 0.36]; % mm/r speedRange = [50 300]; % r/min passRange = [1 6]; % 次 depthPoints = 50; % 每组深度点 numSamples = 90; rng(1); dataAll = []; for i = 1:numSamples P = rand_range(pressureRange); F = rand_range(feedRateRange); S = rand_range(speedRange); Np = rand_range(passRange); % 工艺-参数关联关系 A = 200 + 0.1*P - 80*F - 0.1*S + 20*Np; B = 0.15 + 0.0001*P; C = 100 + 0.05*P; D = 3 + 0.002*S; z0 = 0.25 + 0.05*F; z = linspace(0,1,depthPoints)'; sigma = -A*exp(-((z-z0).^2)/(2*B^2)) + C*exp(-D*z) + randn(size(z))*20; for k = 1:length(z) dataAll = [dataAll; P F S Np sigma(k)]; end end header = {'Pressure','FeedRate','Speed','Passes','ResidualStress'}; T = array2table(dataAll,'VariableNames',header); writetable(T,'RS_dataset.csv'); fprintf('✅ RS_dataset.csv generated (%d samples)\n',height(T)); %% ==================== PART 2 数据预处理 ==================== disp('=== [2/4] Cleaning and preparing dataset ...'); X = T{:,1:4}; Y = T{:,5}; z = linspace(0,1,length(Y))'; % --- LOF异常检测 --- k = 5; [~,D] = knnsearch(X,X,'K',k+1); kDist = D(:,end); reachDist = max(kDist(D(:,end)), D); LRD = 1 ./ mean(reachDist,2); LOF = mean(LRD(knnsearch(X,X,'K',k+1)),2) ./ LRD; mask = LOF < 1; X = X(mask,:); Y = Y(mask); Xn = normalize(X); Yn = normalize(Y); fprintf('✅ %d valid samples after cleaning\n',length(Y)); %% ==================== PART 3 定义PINN模型 ==================== disp('=== [3/4] Building and training PINN model ...'); % 定义组合函数导数 sigma_combined = @(z,A,B,C,D,z0) ... -A.*exp(-((z-z0).^2)./(2*B.^2)) + C.*exp(-D.*z); dSigma = @(z,A,B,C,D,z0) ... A.*(z-z0)./B.^2 .* exp(-((z-z0).^2)/(2*B.^2)) - C.*D.*exp(-D.*z); bfgs_maxsigma = @(A,B,C,D,z0) bfgs_find_max(A,B,C,D,z0,dSigma); % 网络结构 (简化Structure 1+2) inputSize = 4; hiddenSize = 50; layers = [ featureInputLayer(inputSize,"Name","input") fullyConnectedLayer(hiddenSize) reluLayer fullyConnectedLayer(hiddenSize) reluLayer fullyConnectedLayer(1,"Name","output")]; lgraph = layerGraph(layers); net = dlnetwork(lgraph); % 训练参数 learnRate = 5e-4; numEpochs = 300; miniBatchSize = 32; gradDecay = 0.9; sqGradDecay = 0.999; trailingAvg = []; trailingAvgSq = []; numIterPerEpoch = floor(size(Xn,1)/miniBatchSize); for epoch = 1:numEpochs idx = randperm(size(Xn,1)); for i = 1:numIterPerEpoch ind = idx((i-1)*miniBatchSize+1 : i*miniBatchSize); XBatch = dlarray(Xn(ind,:)','CB'); YBatch = dlarray(Yn(ind,:)','CB'); [loss,gradients] = dlfeval(@modelLoss,net,XBatch,YBatch,z,... sigma_combined,dSigma,bfgs_maxsigma); [net,trailingAvg,trailingAvgSq] = adamupdate(net,gradients,... trailingAvg,trailingAvgSq,epoch,learnRate,gradDecay,sqGradDecay); end if mod(epoch,10)==0 fprintf("Epoch %d/%d, Loss = %.5f\n",epoch,numEpochs,double(extractdata(loss))); end end %% ==================== PART 4 模型评估可视化 ==================== disp('=== [4/4] Evaluating and visualizing results ...'); Y_pred = predict(net,Xn')'; Y_pred = rescale(Y_pred, min(Y), max(Y)); RMSE = sqrt(mean((Y - Y_pred).^2)); R2 = corr(Y,Y_pred)^2; fprintf("\n✅ PINN Performance: R² = %.3f, RMSE = %.3f MPa\n",R2,RMSE); figure; scatter(Y,Y_pred,15,'filled'); grid on; xlabel('Measured Residual Stress (MPa)'); ylabel('Predicted Residual Stress (MPa)'); title(sprintf('PINN Residual Stress Prediction\nR²=%.3f, RMSE=%.1f MPa',R2,RMSE)); figure; subplot(1,2,1); plot(Y(1:500),'k','LineWidth',1.2); hold on; plot(Y_pred(1:500),'r--','LineWidth',1.2); xlabel('Sample Index'); ylabel('Residual Stress (MPa)'); legend('Measured','Predicted'); grid on; title('Comparison (Partial Samples)'); subplot(1,2,2); err = Y - Y_pred; histogram(err,30); xlabel('Prediction Error (MPa)'); ylabel('Count'); grid on; title('Error Distribution'); disp('✅ All steps completed successfully.'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ===================== 函数定义部分 ===================================== %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [loss,gradients] = modelLoss(net,XBatch,YBatch,z,sigma_combined,dSigma,bfgs_maxsigma) preds = forward(net,XBatch); preds = preds(1,:); A=1;B=0.2;C=0.5;D=0.3;z0=0.2; % 简化参数 zmax = bfgs_maxsigma(A,B,C,D,z0); delta = 1; err = preds - YBatch; lossData = mean((abs(err)<delta).*0.5.*err.^2 + (abs(err)>=delta).*delta.*(abs(err)-0.5*delta)); dSig = dSigma(z,A,B,C,D,z0); F1 = max(0,dSig(z<zmax)); F2 = max(0,-dSig(z>zmax)); lossPhys = mean([F1;F2].^2); loss = lossData + 0.1*lossPhys; gradients = dlgradient(loss,net.Learnables); end function zmax = bfgs_find_max(A,B,C,D,z0,dSigma) z = z0; Bk=1; tol=1e-6; maxIter=100; for k=1:maxIter grad = dSigma(z,A,B,C,D,z0); if abs(grad)<tol, break; end p = -Bk*grad; alpha = 0.1; z_new = z + alpha*p; yk = dSigma(z_new,A,B,C,D,z0)-grad; sk = z_new - z; Bk = Bk + (yk^2)/(yk*sk) - (Bk^2*sk^2)/(Bk*sk^2); z = z_new; end zmax = z; end function val = rand_range(range) val = range(1) + (range(2)-range(1))*rand; end 修改上述代码,使matlab能够运行
10-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值