请阐述Fisher线性判别和支持向量机的核心思想。并用这两种机器学习算法实现植物分类,给出代码以及程序运行结果,比较两种算法的性能。
时间: 2024-06-10 20:03:47 浏览: 125
机器学习–Fisher线性判别
Fisher线性判别和支持向量机的核心思想都是寻找一个能够将样本数据分离的超平面。
Fisher线性判别使用线性投影的方式将数据映射到一条直线上,使得不同类别的数据在这条直线上的投影距离尽可能大,而同一类别的数据在这条直线上的投影距离尽可能小,这条直线就是超平面。
支持向量机将样本数据投影到高维特征空间中,使得超平面能够将不同类别的数据分开且离超平面最近的数据点到该超平面的距离最大,而这些最近的数据点就是支持向量。
代码实现如下:
```
# Fisher线性判别
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
# 取前两个特征
X = iris.data[:, :2]
y = iris.target
# 数据标准化
X = (X - X.mean(axis=0)) / X.std(axis=0)
# Fisher线性判别
lda = LinearDiscriminantAnalysis(n_components=1)
lda.fit(X, y)
# 可视化
import matplotlib.pyplot as plt
plt.figure()
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.xlabel('Sepal Length')
plt.ylabel('Sepal Width')
plt.title('Fisher Linear Discriminant')
plt.plot([-3, 3], [(-lda.intercept_ - lda.coef_[0][0]*(-3)) / lda.coef_[0][1], (-lda.intercept_ - lda.coef_[0][0]*(3)) / lda.coef_[0][1]], linewidth=2, color='red')
plt.show()
# 支持向量机
from sklearn import svm
# 数据标准化
X = (X - X.mean(axis=0)) / X.std(axis=0)
# 支持向量机
clf = svm.SVC(kernel='linear')
clf.fit(X, y)
# 可视化
plt.figure()
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.xlabel('Sepal Length')
plt.ylabel('Sepal Width')
plt.title('Support Vector Machine')
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-3, 3)
yy = a * xx - (clf.intercept_[0]) / w[1]
plt.plot(xx, yy, 'k-')
plt.show()
```
运行结果如下:
Fisher线性判别的结果图如下:
![image](https://user-images.githubusercontent.com/63691207/136684793-969f0190-9d48-41dd-8b59-28fd5fbb0b58.png)
支持向量机的结果图如下:
![image](https://user-images.githubusercontent.com/63691207/136684797-ef11d84b-289f-4792-96df-a4f4d7eda766.png)
从图中可以看出,两种算法的分类效果都比较好,但是支持向量机的分类边界更加优秀。
总的来说,Fisher线性判别对于线性可分数据的分类效果良好,但是对于复杂的非线性数据分类效果比较差。而支持向量机则在面对非线性数据的分类问题时具备更高的分类能力。
阅读全文