当前位置:   article > 正文

线性判别准则与线性分类编程实践_polynomialsvc(3)

polynomialsvc(3)

一、LDA简介

LDA是文本分析里面一个很有名的topic
model,它基于一个简单的词袋模型,通过概率建模,得到文档和词汇的主题分布。这个模型很为人称道的一个特点,是它的数学推导是比较优雅的,由给定的先验Dirichlet分布,得到文档生成的似然函数,然后得到Gibbs
Sampling收敛时的分布,就是topic的对应分布。LDA在前些日子还是挺流行的,网络上好的介绍文章很多,比如这个blog,新浪的同学写的LDA漫游指南,还有腾讯的LDA数学八卦,都有很详细的推导过程。

二、SVM简介

支持向量机(Support Vector Machine, SVM)的基本模型是在特征空间上找到最佳的分离超平面使得训练集上正负样本间隔最大。SVM是用来解决二分类问题的有监督学习算法(实际上还有多分类,此文没涉及),在引入了核方法之后SVM也可以用来解决非线性问题。

牢记此3类,下面文章将按此顺序介绍,而且每一个都是逐渐递进的包含关系。
一般SVM有下面三种:

1、硬间隔支持向量机(线性可分支持向量机):当训练数据线性可分时,可通过硬间隔最大化学得一个线性可分支持向量机。
2、软间隔支持向量机:当训练数据近似线性可分时,可通过软间隔最大化学得一个线性支持向量机。
3、非线性支持向量机:当训练数据线性不可分时,可通过核方法以及软间隔最大化学得一个非线性支持向量机。

三、LDA代码

导入包:

  1. from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as lda#导入LDA算法
  2. from sklearn.datasets._samples_generator import make_classification #导入分类生成器
  3. import matplotlib.pyplot as plt #导入画图用的工具
  4. import numpy as np
  5. import pandas as pd

获取数据及并训练:

  1. x,y=make_classification(n_samples=500,n_features=2,n_redundant=0,n_classes=2,n_informative=1,n_clusters_per_class=1,class_sep=0.5,random_state=100)
  2. plt.scatter(x[:,0],x[:,1], marker='o', c=y)
  3. plt.show()
  4. x_train=x[:60, :60]
  5. y_train=y[:60]
  6. x_test=x[40:, :]
  7. y_test=y[40:]

将训集和测试集分为6:4,训练完之后利用测试集获得准确率

  1. #分为训练集和测试集,进行模型训练并测试
  2. x_train=x[:300, :300]
  3. y_train=y[:300]
  4. x_test=x[200:, :]
  5. y_test=y[200:]
  6. lda_test=lda()
  7. lda_test.fit(x_train,y_train)
  8. predict_y=lda_test.predict(x_test)#获取预测的结果
  9. count=0
  10. for i in range(len(predict_y)):
  11. if predict_y[i]==y_test[i]:
  12. count+=1
  13. print("预测准确个数为"+str(count))
  14. print("准确率为"+str(count/len(predict_y)))

四、SVM代码实现

1、 线性SVM

导入包:

  1. # 导入月亮数据集和svm方法
  2. #这是线性svm
  3. from sklearn import datasets #导入数据集
  4. from sklearn.svm import LinearSVC #导入线性svm
  5. from matplotlib.colors import ListedColormap
  6. from sklearn.preprocessing import StandardScaler

获取数据:

  1. data_x,data_y=datasets.make_moons(noise=0.15,random_state=777)#生成月亮数据集
  2. # random_state是随机种子,nosie是方
  3. plt.scatter(data_x[data_y==0,0],data_x[data_y==0,1])
  4. plt.scatter(data_x[data_y==1,0],data_x[data_y==1,1])
  5. data_x=data_x[data_y<2,:2]#只取data_y小于2的类别,并且只取前两个特征
  6. plt.show()

 标准化并训练数据:

  1. scaler=StandardScaler()# 标准化
  2. scaler.fit(data_x)#计算训练数据的均值和方差
  3. data_x=scaler.transform(data_x) #再用scaler中的均值和方差来转换X,使X标准化
  4. liner_svc=LinearSVC(C=1e9,max_iter=100000)#线性svm分类器,iter是迭达次数,c值决定的是容错,c越大,容错越小
  5. liner_svc.fit(data_x,data_y)

这里有一个警告,但并不影响我们输出

绘制边界函数和显示参数和截距

  1. # 边界绘制函数
  2. def plot_decision_boundary(model,axis):
  3. x0,x1=np.meshgrid(
  4. np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
  5. np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1))
  6. # meshgrid函数是从坐标向量中返回坐标矩阵
  7. x_new=np.c_[x0.ravel(),x1.ravel()]
  8. y_predict=model.predict(x_new)#获取预测值
  9. zz=y_predict.reshape(x0.shape)
  10. custom_cmap=ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
  11. plt.contourf(x0,x1,zz,cmap=custom_cmap)
  12. #画图并显示参数和截距
  13. plot_decision_boundary(liner_svc,axis=[-3,3,-3,3])
  14. plt.scatter(data_x[data_y==0,0],data_x[data_y==0,1],color='red')
  15. plt.scatter(data_x[data_y==1,0],data_x[data_y==1,1],color='blue')
  16. plt.show()
  17. print('参数权重')
  18. print(liner_svc.coef_)
  19. print('模型截距')
  20. print(liner_svc.intercept_)

2、多项式核

导入包:

  1. # 导入月亮数据集和svm方法
  2. #这是多项式核svm
  3. from sklearn import datasets #导入数据集
  4. from sklearn.svm import LinearSVC #导入线性svm
  5. from sklearn.pipeline import Pipeline #导入python里的管道
  6. from matplotlib.colors import ListedColormap
  7. import matplotlib.pyplot as plt
  8. from sklearn.preprocessing import StandardScaler,PolynomialFeatures #导入多项式回归和标准化

生成数据,和上面一致:

  1. data_x,data_y=datasets.make_moons(noise=0.15,random_state=777)#生成月亮数据集
  2. # random_state是随机种子,nosie是方
  3. plt.scatter(data_x[data_y==0,0],data_x[data_y==0,1])
  4. plt.scatter(data_x[data_y==1,0],data_x[data_y==1,1])
  5. data_x=data_x[data_y<2,:2]#只取data_y小于2的类别,并且只取前两个特征
  6. plt.show()

  1. def PolynomialSVC(degree,c=10):#多项式svm
  2. return Pipeline([
  3. # 将源数据 映射到 3阶多项式
  4. ("poly_features", PolynomialFeatures(degree=degree)),
  5. # 标准化
  6. ("scaler", StandardScaler()),
  7. # SVC线性分类器
  8. ("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42,max_iter=10000))
  9. ])

进行训练并画图:

  1. # 进行模型训练并画图
  2. poly_svc=PolynomialSVC(degree=3)
  3. poly_svc.fit(data_x,data_y)
  4. plot_decision_boundary(poly_svc,axis=[-1.5,2.5,-1.0,1.5])#绘制边界
  5. plt.scatter(data_x[data_y==0,0],data_x[data_y==0,1],color='red')#画点
  6. plt.scatter(data_x[data_y==1,0],data_x[data_y==1,1],color='blue')
  7. plt.show()
  8. print('参数权重')
  9. print(poly_svc.named_steps['svm_clf'].coef_)
  10. print('模型截距')
  11. print(poly_svc.named_steps['svm_clf'].intercept_)

 

正确输出

三、高斯核 

第一步还是导入包

  1. ## 导入包
  2. from sklearn import datasets #导入数据集
  3. from sklearn.svm import SVC #导入svm
  4. from sklearn.pipeline import Pipeline #导入python里的管道
  5. import matplotlib.pyplot as plt
  6. from sklearn.preprocessing import StandardScaler#导入标准化

导入数据:

  1. data_x,data_y=datasets.make_moons(noise=0.15,random_state=777)#生成月亮数据集
  2. # random_state是随机种子,nosie是方
  3. plt.scatter(data_x[data_y==0,0],data_x[data_y==0,1])
  4. plt.scatter(data_x[data_y==1,0],data_x[data_y==1,1])
  5. data_x=data_x[data_y<2,:2]#只取data_y小于2的类别,并且只取前两个特征
  6. plt.show()
  7. def PolynomialSVC(degree,c=10):#多项式svm
  8. return Pipeline([
  9. # 将源数据 映射到 3阶多项式
  10. ("poly_features", PolynomialFeatures(degree=degree)),
  11. # 标准化
  12. ("scaler", StandardScaler()),
  13. # SVC线性分类器
  14. ("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42,max_iter=10000))
  15. ])

定义SVM高斯模型:

  1. def RBFKernelSVC(gamma=1.0):
  2. return Pipeline([
  3. ('std_scaler',StandardScaler()),
  4. ('svc',SVC(kernel='rbf',gamma=gamma))
  5. ])

进行模型训练画出图形,这里面的gamma参数也很重要,gamma参数越大,支持向量越小,和C是差不多,改变gamma的值,判断区域会发生变化

  1. svc=RBFKernelSVC(gamma=100)#gamma参数很重要,gamma参数越大,支持向量越小
  2. svc.fit(data_x,data_y)
  3. plot_decision_boundary(svc,axis=[-1.5,2.5,-1.0,1.5])
  4. plt.scatter(data_x[data_y==0,0],data_x[data_y==0,1],color='red')#画点
  5. plt.scatter(data_x[data_y==1,0],data_x[data_y==1,1],color='blue')
  6. plt.show()

四、鸢尾花数据集

  导入包和读取数据集

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn import datasets
  4. from sklearn.preprocessing import StandardScaler
  5. from sklearn.svm import LinearSVC
  6. #读取鸢尾花数据集
  7. data=datasets.load_iris()
  8. data_x=data.data
  9. data_y=data.target
  10. plt.scatter(data_x[data_y==0,0],data_x[data_y==0,1])
  11. plt.scatter(data_x[data_y==1,0],data_x[data_y==1,1])
  12. data_x=data_x[data_y<2,:2]#只取data_y小于2的类别,并且只取前两个特征
  13. data_y=data_y[data_y<2]
  14. plt.show()

标准化

  1. scaler=StandardScaler()# 标准化
  2. scaler.fit(data_x)#计算训练数据的均值和方差
  3. data_x=scaler.transform(data_x) #再用scaler中的均值和方差来转换X,使X标准化
  4. liner_svc=LinearSVC(C=1e9,max_iter=100000)#线性svm分类器,iter是迭达次数,c值决定的是容错,c越大,容错越小
  5. liner_svc.fit(data_x,data_y)
  6. # 边界绘制函数
  7. def plot_decision_boundary(model,axis):
  8. x0,x1=np.meshgrid(
  9. np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
  10. np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1))
  11. # meshgrid函数是从坐标向量中返回坐标矩阵
  12. x_new=np.c_[x0.ravel(),x1.ravel()]
  13. y_predict=model.predict(x_new)#获取预测值
  14. zz=y_predict.reshape(x0.shape)
  15. custom_cmap=ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
  16. plt.contourf(x0,x1,zz,cmap=custom_cmap)
  17. #画图并显示参数和截距
  18. plot_decision_boundary(liner_svc,axis=[-3,3,-3,3])
  19. plt.scatter(data_x[data_y==0,0],data_x[data_y==0,1],color='red')
  20. plt.scatter(data_x[data_y==1,0],data_x[data_y==1,1],color='blue')
  21. plt.show()
  22. print('参数权重')
  23. print(liner_svc.coef_)
  24. print('模型截距')
  25. print(liner_svc.intercept_)

 

 多项式核

  1. def PolynomialSVC(degree,c=10):#多项式svm
  2. return Pipeline([
  3. # 将源数据 映射到 3阶多项式
  4. ("poly_features", PolynomialFeatures(degree=degree)),
  5. # 标准化
  6. ("scaler", StandardScaler()),
  7. # SVC线性分类器
  8. ("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42,max_iter=10000))
  9. ])
  10. # 进行模型训练并画图
  11. poly_svc=PolynomialSVC(degree=3)
  12. poly_svc.fit(data_x,data_y)
  13. plot_decision_boundary(poly_svc,axis=[-2,2.5,-3,3])#绘制边界
  14. plt.scatter(data_x[data_y==0,0],data_x[data_y==0,1],color='red')#画点
  15. plt.scatter(data_x[data_y==1,0],data_x[data_y==1,1],color='blue')
  16. plt.show()
  17. print('参数权重')
  18. print(poly_svc.named_steps['svm_clf'].coef_)
  19. print('模型截距')
  20. print(poly_svc.named_steps['svm_clf'].intercept_)

高斯核

  1. def RBFKernelSVC(gamma=1.0):
  2. return Pipeline([
  3. ('std_scaler',StandardScaler()),
  4. ('svc',SVC(kernel='rbf',gamma=gamma))
  5. ])
  6. svc=RBFKernelSVC(gamma=100)#gamma参数很重要,gamma参数越大,支持向量越小
  7. svc.fit(data_x,data_y)
  8. plot_decision_boundary(svc,axis=[-2,2.5,-3,3])
  9. plt.scatter(data_x[data_y==0,0],data_x[data_y==0,1],color='red')#画点
  10. plt.scatter(data_x[data_y==1,0],data_x[data_y==1,1],color='blue')
  11. plt.show()

 

 

五、总结

通过对SVM和LDA的使用,加深了对这种方法的熟悉,机器训练还是很有意思的,做得并不是很困难,需要加深学习。

六、参考

LDA与SVM实践(python实现)

错误解决

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/195639
推荐阅读
相关标签
  

闽ICP备14008679号