🧄R和Python主成分分析(PCA)线性判别分析(LDA)及其K-最近邻分类器和病理预测
R | Python | 主成分分析(PCA) | 线性判别分析(LDA) | K-最近邻算法 | 分类器 | 病理 | NumPy | scikit-learn | Matplotlib | Pandas
R主成分分析(PCA)和线性判别分析(LDA)
R主成分分析(PCA)
在此,我们将使用此机器学习存储库中的数据集作为我们的数据。如下,加载:
wdbc <- read.csv("wdbc.csv", header = F)
features <- c("radius", "texture", "perimeter", "area", "smoothness", "compactness", "concavity", "concave_points", "symmetry", "fractal_dimension")
names(wdbc) <- c("id", "diagnosis", paste0(features,"_mean"), paste0(features,"_se"), paste0(features,"_worst"))
上面的代码将简单地加载数据并命名所有 32 个变量。 ID、诊断和十个不同 (30) 特征。
现在我们已经加载了我们的数据并发现自己有 30 个变量(不包括我们的响应“诊断”和不相关的 ID 变量)。
当我们尝试使用 PCA 的线性组合来描述数据中的差异时,我们发现“良性”和“恶性”病理之间存在一些非常明显的聚类和分离! 这为基于我们的特征开发分类模型提供了一个很好的案例!PCA 的另一个主要“功能”,是它实际上可以直接提高模型的性能。
PCA工作原理
PCA 的主要目的不是删除! 事实上,它可以降低维度,但不会减少数据中的特征/变量的数量。 这意味着您可能会发现仅使用 3 个主成分就可以解释 1000 个特征数据集中 99% 的方差,但您仍然需要这 1000 个特征来构建这 3 个主成分,这也意味着对于未来的数据的预测,您仍然需要在新观察中使用相同的 1000 个特征来构建相应的主成分。
简而言之,其特点是:
标准化数据(中心和比例)
从协方差矩阵或相关矩阵计算特征向量和特征值(也可以使用奇异向量分解)。
按降序对特征值进行排序,并选择 K 个最大的特征向量(其中 K 是新特征子空间 k ≤ d 的所需维数)。
从选定的 K 个特征向量构造投影矩阵 W。
通过W对原始数据集X进行变换,得到一个K维特征子空间Y。
R编程PCA
wdbc.pr <- prcomp(wdbc[c(3:32)], center = TRUE, scale = TRUE)
summary(wdbc.pr)
绘图
screeplot(wdbc.pr, type = "l", npcs = 15, main = "Screeplot of the first 10 PCs")
abline(h = 1, col="red", lty=5)
legend("topright", legend=c("Eigenvalue = 1"),
col=c("red"), lty=5, cex=0.6)
cumpro <- cumsum(wdbc.pr$sdev^2 / sum(wdbc.pr$sdev^2))
plot(cumpro[0:15], xlab = "PC #", ylab = "Amount of explained variance", main = "Cumulative variance plot")
abline(v = 6, col="blue", lty=5)
abline(h = 0.88759, col="blue", lty=5)
legend("topleft", legend=c("Cut-off @ PC6"),
col=c("blue"), lty=5, cex=0.6)
R线性判别分析(LDA)
项目:病理预测
源代码
Python主成分分析(PCA)和线性判别分析(LDA)
主成分分析(PCA)
线性判别分析(LDA)
使用 LDA 进行降维:
# input and output variables
X = dataset.data
y = dataset.target
target_names = dataset.target_names
# importing the requried module
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# initializing the model with 2 components
lda = LinearDiscriminantAnalysis(n_components=2)
# fitting the dataset
X_r2 = lda.fit(X, y).transform(X)
绘制数据集:
# importing the required module
import matplotlib.pyplot as plt
# plot size
plt.figure(figsize=(15, 8))
# plotting the graph
plt.scatter(X_r2[:,0],X_r2[:,1], c=dataset.target)
plt.show()
项目:K-最邻近分类器
源代码
Last updated