多元分析方法

1. 判别分析

判别分析是 一 种分类方法,它是根据已掌握的 每个类别的若干样本的数据信息,求出判别函数,再根据判别函数判别未知样本点所属的类别

1.1 距离判别法

距离判别法就是建立待判定对象工到Ai的距离d( 工,A i ),然后根据距离最近原则进行判别。距离一般采用Mahalanobis距离(马氏距离)

多元分析方法_第1张图片

【例题】

from sklearn.neighbors import KNeighborsClassifier

多元分析方法_第2张图片

#程序文件Pex11_1.py
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
x0=np.array([[1.24,1.27], [1.36,1.74], [1.38,1.64], [1.38,1.82], [1.38,1.90], [1.40,1.70],
    [1.48,1.82], [1.54,1.82], [1.56,2.08], [1.14,1.78], [1.18,1.96], [1.20,1.86],
    [1.26,2.00], [1.28,2.00], [1.30,1.96]])   #输入已知样本数据
x=np.array([[1.24,1.80], [1.28,1.84], [1.40,2.04]])  #输入待判样本点数据
#np.hstack 是用来将数组水平堆叠(按列)的函数
#np.ones(9) 创建了一个包含9个1的数组,2*np.ones(6) 创建了一个包含6个2的数组。
g=np.hstack([np.ones(9),2*np.ones(6)])  #g为已知样本数据的类别标号
v=np.cov(x0.T)  #计算协方差
knn=KNeighborsClassifier(2,metric='mahalanobis',metric_params={'V': v}) #马氏距离分类
knn.fit(x0,g); 
pre=knn.predict(x); 
print("马氏距离分类结果:",pre)
print("马氏距离已知样本的误判率为:",1-knn.score(x0,g))
knn2=KNeighborsClassifier(2)  #欧氏距离分类
knn2.fit(x0,g); 
pre2=knn2.predict(x); 
print("欧氏距离分类结果:",pre2)
print("欧氏距离已知样本的误判率为:",1-knn2.score(x0,g))

knn.fit(x0, g) 是一个机器学习中常见的方法调用,它用于训练(拟合)K最近邻(KNN)分类器模型。

具体来说,knn 是一个KNN分类器对象,通过 KNeighborsClassifier 类创建。fit 方法用于训练模型,其中 x0 是已知样本数据的特征向量,g 是已知样本数据的类别标签。在这个例子中,x0 是已知样本数据的特征向量,g 是已知样本数据的类别标签,我们将这些数据传递给 fit 方法,以便KNN分类器可以根据这些数据学习如何对新的数据进行分类。

在这个上下文中,np.ones(9) 和 2*np.ones(6) 分别代表两个不同的类别标签,可能对应于两个不同的类别。在分类问题中,我们需要为每个样本指定一个类别标签,以便在训练和预测过程中能够区分不同的类别。因此,np.hstack 的目的是将这两个类别的标签水平堆叠在一起,以便为已知样本数据分配类别标签。

np.cov(x0.T) 计算了已知样本数据 x0 的特征向量的协方差矩阵。协方差矩阵描述了特征之间的线性相关性,它可以提供有关特征之间关系的重要信息。然后,将这个协方差矩阵传递给 KNN 分类器的 metric_params 参数,以便在构造分类器时使用马氏距离作为距离度量。

在 KNeighborsClassifier 的构造函数中,metric='mahalanobis' 表示使用马氏距离作为距离度量,metric_params={'V': v} 则将协方差矩阵作为参数传递给了马氏距离的计算方法。

score:Return the mean accuracy on the given test data and labels.

【例题】

#程序文件Pex11_2.py
import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
a=pd.read_excel("Pdata11_2.xlsx",header=None)
b=a.values
x0=b[:-2,1:-1].astype(float)  #提取已知样本点的观测值
y0=b[:-2,-1].astype(int)
x=b[-2:,1:-1]  #提取待判样本点的观察值
v=np.cov(x0.T)  #计算协方差
knn=KNeighborsClassifier(3,metric='mahalanobis',metric_params={'V': v}) #马氏距离分类
knn.fit(x0,y0); pre=knn.predict(x); print("分类结果:",pre)
print("已知样本的误判率为:",1-knn.score(x0,y0))

1.2 Fisher判别法

Fisher判别法是基于方差分析的判别法,效果比距离判别法好

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

【蠓虫分类例子】

#程序文件Pex11_3.py
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
x0=np.array([[1.24,1.27], [1.36,1.74], [1.38,1.64], [1.38,1.82], [1.38,1.90], [1.40,1.70],
    [1.48,1.82], [1.54,1.82], [1.56,2.08], [1.14,1.78], [1.18,1.96], [1.20,1.86],
    [1.26,2.00], [1.28,2.00], [1.30,1.96]])   #输入已知样本数据
x=np.array([[1.24,1.80], [1.28,1.84], [1.40,2.04]])  #输入待判样本点数据
y0=np.hstack([np.ones(9),2*np.ones(6)])  #y0为已知样本数据的类别
clf = LDA()
clf.fit(x0, y0)
print("判别结果为:",clf.predict(x))
print("已知样本的误判率为:",1-clf.score(x0,y0))

【健康人群例子】

import numpy as np
import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA

data = pd.read_excel("D:\桌面的文件\Pdata11_2.xlsx",header=None)
a = data.values
x0 = a[:-2,1:-1].astype(float)
x1 = a[-2:,1:-1]
x2 = a[:-2,-1].astype(int)

clf = LDA()
clf.fit(x0,x2); 
pre=clf.predict(x1); 
print("分类结果:",pre)
print("已知样本的误判率为:",1-clf.score(x0,x2))

#分类结果: [1 2]
#已知样本的误判率为: 0.0

1.3 贝叶斯判别法 

from sklearn.naive_bayes import GaussianNB

【蠓虫分类例子】

import numpy as np
import pandas as pd
from sklearn.naive_bayes import GaussianNB
x0=np.array([[1.24,1.27], [1.36,1.74], [1.38,1.64], [1.38,1.82], [1.38,1.90], [1.40,1.70],
    [1.48,1.82], [1.54,1.82], [1.56,2.08], [1.14,1.78], [1.18,1.96], [1.20,1.86],
    [1.26,2.00], [1.28,2.00], [1.30,1.96]])   #输入已知样本数据
x=np.array([[1.24,1.80], [1.28,1.84], [1.40,2.04]])  #输入待判样本点数据
#np.hstack 是用来将数组水平堆叠(按列)的函数
#np.ones(9) 创建了一个包含9个1的数组,2*np.ones(6) 创建了一个包含6个2的数组。
g=np.hstack([np.ones(9),2*np.ones(6)])  #g为已知样本数据的类别标号

clf = GaussianNB()
clf.fit(x0,g); 
pre=clf.predict(x); 
print("分类结果:",pre)
print("已知样本的误判率为:",1-clf.score(x0,g))

1.4 判别准则的评价

当准则提出后还要去判断他的误判率,一般采用回代法和交叉法。

from sklearn.model_selection import cross_val_score

多元分析方法_第3张图片

import numpy as np
import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.model_selection import cross_val_score

data = pd.read_excel("D:\桌面的文件\Pdata11_2.xlsx",header=None)
a = data.values
x0 = a[:-2,1:-1].astype(float)
x2 = a[:-2,-1].astype(int)

model = LDA()
print(cross_val_score(model,x0,x2,cv=2))

#[0.9 0.8]

2. 主成分分析

利用降维的方法把多指标转换成几个综合指标进行多元分析统计

多元分析方法_第4张图片

【主要步骤】

1. 对指标进行标准化 zscore

2. 根据标准化的数据矩阵求出相关系数矩阵 np.corrcoef

3. 计算出相关系数矩阵的特征值以及对应的标准正交化特征向量 np.linalg.eig

4. 计算主成分贡献率以及累计贡献率

5. 一般取累计贡献率85%以上的特征值对应的主成分

6. 最后利用得到的主成分分析问题,或者继续进行评价/回归/聚类等建模

【PCA】from sklearn.decomposition import PCA

多元分析方法_第5张图片

【例题】

多元分析方法_第6张图片

#程序文件Pex11_7.py
import numpy as np
from sklearn.decomposition import PCA
a=np.loadtxt("D:/桌面的文件/Pdata11_7.txt")
b=np.r_[a[:,1:4],a[:,-3:]]  #构造数据矩阵
md=PCA().fit(b)  #构造并训练模型
print("特征值为:",md.explained_variance_)
print("各主成分的贡献率:",md.explained_variance_ratio_)
print("奇异值为:",md.singular_values_)
print("各主成分的系数:\n",md.components_)  #每行是一个主成分
"""下面直接计算特征值和特征向量,和库函数进行对比"""
cf=np.cov(b.T)  #计算协方差阵
c,d=np.linalg.eig(cf) #求特征值和特征向量
print("特征值为:",c)
print("特征向量为:\n",d)
print("各主成分的贡献率为:",c/np.sum(c))


#下面是结果
特征值为: [110.00413886  25.32447973   1.56804807]
各主成分的贡献率: [0.80355601 0.18498975 0.01145425]
奇异值为: [31.46485738 15.09703009  3.75665179]
各主成分的系数:
 [[-0.55915657 -0.42128705 -0.71404562]
 [ 0.82767368 -0.33348264 -0.45138188]
 [-0.04796048 -0.84338992  0.53515721]]
特征值为: [110.00413886  25.32447973   1.56804807]
特征向量为:
 [[ 0.55915657  0.82767368 -0.04796048]
 [ 0.42128705 -0.33348264 -0.84338992]
 [ 0.71404562 -0.45138188  0.53515721]]
各主成分的贡献率为: [0.80355601 0.18498975 0.01145425]

 取前两个主成分,F1=0.5592x1+0.4213x2+0.7140x3,F2=0.8277x1-0.3335x2-0.4514x3。

【注】使用库函数PCA进行分析,系数正负号是不可控的,还是直接计算特征向量和特征值好

【例题】

多元分析方法_第7张图片

import numpy as np
from scipy.stats import zscore
a=np.loadtxt("D:/桌面的文件/Pdata11_8.txt")
print("相关系数阵为:\n",np.corrcoef(a.T))
b=np.delete(a,0,axis=1) #删除第1列数据
c=zscore(b);#数据标准化
r=np.corrcoef(c.T) #并计算相关系数阵
d,e=np.linalg.eig(r) #求特征值和特征向量
rate=d/d.sum()  #计算各主成分的贡献率

print("特征值为:",d)
print("特征向量为:\n",e)
print("各主成分的贡献率为:",rate)

k=1; #提出主成分的个数
F=e[:,:k]; 
score_mat=c.dot(F) #计算主成分得分矩阵
score1=score_mat.dot(rate[0:k])  #计算各评价对象的得分
score2=-score1  #通过观测,调整得分的正负号
print("各评价对象的得分为:",score2) 
index=score1.argsort()+1   #排序后的每个元素在原数组中的位置
print("从高到低各个城市的编号排序为:",index)

Z-Score标准化是数据处理的一种常用方法。通过它能够将不同量级的数据转化为统一量度的Z-Score分值进行比较。

3. 因子分析

因子分析是将原始变量分解成若干因子的线性组合 

#程序文件Pan11_1.py
import numpy as np; import pandas as pd
from sklearn import decomposition as dc
from scipy.stats import zscore
import matplotlib.pyplot as plt
c=pd.read_excel("D:/桌面的文件/Pan11_1_1.xlsx",usecols=np.arange(1,7))
c=c.values.astype(float)
d=zscore(c)          #数据标准化
r=np.corrcoef(d.T)   #求相关系数矩阵
val,vec=np.linalg.eig(r)
cs=np.cumsum(val)  #求特征值的累加和
print("特征值为:",val,"\n累加和为:",cs)

fa = dc.FactorAnalysis(n_components = 2)  #创建一个因子分析模型,指定要提取的因子数量为2
fa.fit(d)   #求解最大方差的模型
print("载荷矩阵为:\n",fa.components_)
print("特殊方差为:\n",fa.noise_variance_)
dd=fa.fit_transform(d)   #计算因子得分
w=val[:2]/sum(val[:2])  #计算两个因子的权重
df=np.dot(dd,w)        #计算每个评价对象的因子总分
tf=np.sum(c,axis=1)     #计算每个评价对象的实分总分
#构造pandas数据框,第1列到第5列数据分别为因子1得分,因子2得分,因子总分、实分总分和序号
pdf=pd.DataFrame(np.c_[dd,df,tf,np.arange(1,53)],columns=['f1','f2','yf','tf','xh'])
spdf1=pdf.sort_values(by='yf',ascending = False)  #y因子总分从高到低排序
spdf2=pdf.sort_values(by='tf',ascending=False)  #实分总分从高到低排序
print("排序结果为:\n",spdf1,'\n',spdf2)

你可能感兴趣的:(数学建模,算法,python)