判别分析是 一 种分类方法,它是根据已掌握的 每个类别的若干样本的数据信息,求出判别函数,再根据判别函数判别未知样本点所属的类别
距离判别法就是建立待判定对象工到Ai的距离d( 工,A i ),然后根据距离最近原则进行判别。距离一般采用Mahalanobis距离(马氏距离)
【例题】
from sklearn.neighbors import KNeighborsClassifier
#程序文件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))
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
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))
当准则提出后还要去判断他的误判率,一般采用回代法和交叉法。
from sklearn.model_selection import cross_val_score
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]
利用降维的方法把多指标转换成几个综合指标进行多元分析统计
【主要步骤】
1. 对指标进行标准化 zscore
2. 根据标准化的数据矩阵求出相关系数矩阵 np.corrcoef
3. 计算出相关系数矩阵的特征值以及对应的标准正交化特征向量 np.linalg.eig
4. 计算主成分贡献率以及累计贡献率
5. 一般取累计贡献率85%以上的特征值对应的主成分
6. 最后利用得到的主成分分析问题,或者继续进行评价/回归/聚类等建模
【PCA】from sklearn.decomposition import PCA
【例题】
#程序文件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进行分析,系数正负号是不可控的,还是直接计算特征向量和特征值好
【例题】
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分值进行比较。
因子分析是将原始变量分解成若干因子的线性组合
#程序文件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)