LDA降维和分类

LDA降维和分类


LDA可以降维和分类
LinearDiscriminantAnalysis(LDA):
就是将多维的样本数据集映射到一个坐标轴上(可以是多维的(以降维作为目的)),使得样本数据可以在这个坐标轴上就可以进行分类,和最小的类内距离,投影后使样本在新的子空间有最大的类间距离即样本在该空间中有最佳的可分离性。(即用这个坐标系就可以进行样本分类了,以达到计算简单,减小计算时间)
分类前的降维
LDA降维:是为了在坐标轴上的同类更集中,异类更分散


# coding=utf-8

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import numpy as np


def main():
np.random.seed(0)
# 设置随机种子,不设置的话默认是按系统时间作为参数,因此每次调用随机模块时产生的随机数都不一样设置后每次产生的一样
iris = datasets.load_iris()
# 导入鸢尾花的数据集,iris是一个类似于结构体的东西,内部有样本数据,如果是监督学习还有标签数据
iris_x = iris.data
# 样本数据150*4二维数据,代表150个样本,每个样本4个属性分别为花瓣和花萼的长、宽
iris_y = iris.target
# 长150的以为数组,样本数据的标签
indices = np.random.permutation(len(iris_x))
# permutation接收一个数作为参数(150),产生一个0-149一维数组,只不过是随机打乱的,当然她也可以接收一个一维数组作为参数,结果是直接对这个数组打乱
iris_x_train = iris_x[indices[:-10]]
# 随机选取140个样本作为训练数据集
iris_y_train = iris_y[indices[:-10]]

# 并且选取这140个样本的标签作为训练数据集的标签
iris_x_test = iris_x[indices[-10:]]
# 剩下的10个样本作为测试数据集

iris_y_test = iris_y[indices[-10:]]

# 降为2维进行分类
lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(iris_x_train, iris_y_train)

# 显示训练结果
print("lda.means_")
print(lda.means_) # 中心点
print("score")
print(lda.score(iris_x_test, iris_y_test)) # score是指分类的正确率
print("lda.scalings_")
print(lda.scalings_) # score是指分类的正确率

X_2d_test = lda.transform(iris_x_test)
print("X_2d_test")
print(X_2d_test) # score是指分类的正确率

# 降维后进行训练
X_2d = lda.transform(iris_x_train) # 现在已经降到二维X_2d=np.dot(X-lda.xbar_,lda.scalings_)
lda.fit(X_2d, iris_y_train)

# 降维后预测
predict_y = lda.predict(X_2d_test)

print("predict_y")
print(predict_y) #
# [1 2 1 0 0 0 2 1 2 0]

print("iris_y_test")
print(iris_y_test) #
# [1 1 1 0 0 0 2 1 2 0]

# # 对于二维数据,我们做个可视化
# # 区域划分
# # lda.fit(X_2d, iris_y_test)
h = 0.02
# 得到最大值和最小值
x_min, x_max = X_2d[:, 0].min() - 1, X_2d[:, 0].max() + 1
y_min, y_max = X_2d[:, 1].min() - 1, X_2d[:, 1].max() + 1
# 网格数据
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))

predict_x = np.c_[xx.ravel(), yy.ravel()]
print("predict_x")
print(predict_x) #

Z = lda.predict(predict_x)
print("Z")
print(Z) #
# [2 2 2... 0 0 0]

#变为与XX的维数相同
Z = Z.reshape(xx.shape)
print("Z")
print(Z) #

# contour和contourf都是画三维等高线图的,不同点在于contourf会对等高线间的区域进行填充,
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
#
# 做出原来的散点图
class1_x = X_2d[iris_y_train == 0, 0]#得到iris_y_train == 0的数组X,布尔索引
class1_y = X_2d[iris_y_train == 0, 1]#得到iris_y_train == 0的数组Y
l1 = plt.scatter(class1_x, class1_y, color='b', label=iris.target_names[0])
class1_x = X_2d[iris_y_train == 1, 0]
class1_y = X_2d[iris_y_train == 1, 1]
l2 = plt.scatter(class1_x, class1_y, color='y', label=iris.target_names[1])
class1_x = X_2d[iris_y_train == 2, 0]
class1_y = X_2d[iris_y_train == 2, 1]
l3 = plt.scatter(class1_x, class1_y, color='r', label=iris.target_names[2])

plt.legend(handles=[l1, l2, l3], loc='best')

plt.grid(True)
plt.show()


if __name__ == '__main__':
main()





# coding=utf-8

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import numpy as np


def main():
data=np.array([[1,1],[2,2],[1.5,1.5],[3,3],[2,3],[1,5]])

X = data[:, 0].reshape(-1, 1) # 将array转换成矩阵(变成n行1列)
y = data[:, 1].reshape(-1, 1)

print("X=", X)
print("y=", y)
# 画相关的点
plt.plot(X, y, "b.")
plt.xlabel('X')
plt.ylabel('y')
plt.show()

z_train = [0,0,0,1,1,1]

lda = LinearDiscriminantAnalysis(n_components=2)
lda.fit(data, z_train)
predict_y = lda.predict([[2,1.5]])
print('predict_y', predict_y) # 中心点

train_lda_X = lda.transform(data)
print("train_lda_X ", train_lda_X)
print("截距: ", lda.intercept_)
print("系数: ", lda.coef_)


# 显示训练结果
# print(lda.means_) # 中心点
# print(lda.score(X_test, Y_test)) # score是指分类的正确率
# print(lda.scalings_) # score是指分类的正确率

# predict_y = lda.predict([2,1.5])
# print("predict_y: ", predict_y)


if __name__ == '__main__':
main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jie310600

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值