对鸢尾花数据集和月亮数据集,分别采用线性LDA、k-means和SVM算法进行二分类可视化分析
一、鸢尾花数据集二分类可视化分析
1、线性LDA可视化
Python完整代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_classification
def LDA(X, y):
X1 = np.array([X[i] for i in range(len(X)) if y[i] == 0])
X2 = np.array([X[i] for i in range(len(X)) if y[i] == 1])
len1 = len(X1)
len2 = len(X2)
# 求均值向量u1,u2
miu1 = np.mean(X1, axis=0)
miu2 = np.mean(X2, axis=0)
# 求S_w
# \sum_0
conv1 = np.dot((X1 - miu1).T, (X1 - miu1))
# \sum_1
conv2 = np.dot((X2 - miu2).T, (X2 - miu2))
Sw = conv1 + conv2
# 计算w
w = np.dot(np.mat(Sw).I, (miu1 - miu2).reshape((len(miu1), 1)))
X1_new = np.dot(X1, w)
X2_new = np.dot(X2, w)
y1_new = [0 for i in range(len1)]
y2_new = [1 for i in range(len2)]
return X1_new, X2_new, y1_new, y2_new
def main():
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=10)
X1_new, X2_new, y1_new, y2_new = LDA(X, y)
# 可视化原始数据
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
plt.show()
# 可视化LDA降维后的数据
#plt.plot(X1_new, y1_new, "bo")
#plt.plot(X2_new, y2_new, "ro")
#plt.show()
main()
分类结果:
2、k-means可视化
Python代码:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn import datasets
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data[:, 2:4] ##表示我们只取特征空间中的后两个维度
print(X.shape)
#绘制数据分布图
plt.scatter(X[:, 0], X[:, 1], c = "red", marker='o', label='see')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
estimator = KMeans(n_clusters=2)#构造聚类器
estimator.fit(X)#聚类
label_pred = estimator.labels_ #获取聚类标签
#绘制k-means结果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
#x2 = X[label_pred == 2]
plt.scatter(x0[:, 0], x0