鸢尾花数据集、月亮数据集二分类可视化分析
鸢尾花数据集、月亮数据集二分类可视化分析
目录
- 鸢尾花数据集、月亮数据集二分类可视化分析
- 一、线性LDA算法
- 1、LDA算法
- 2、鸢尾花数据集
- 2、月亮数据集
- 二、K-Means算法
- 1、K-Means算法
- 2、鸢尾花数据集
- 3、月亮数据集
- 三、SVM算法
- 1、SVM算法
- 2、鸢尾花数据集
- 3、月亮数据集
- 四、SVM算法优缺点
- 1、优点
- 2、缺点
一、线性LDA算法
1、LDA算法
线性判别式分析(Linear Discriminant Analysis, LDA),也叫做Fisher线性判别(Fisher Linear Discriminant ,FLD)。鉴别分析的基本思想是将高维的模式样本投影到最佳鉴别矢量空间,以达到抽取分类信息和压缩特征空间维数的效果,投影后保证模式样本在新的子空间有最大的类间距离和最小的类内距离,即模式在该空间中有最佳的可分离性。以利于分类等任务即将不同类的样本有效的分开。LDA 可以提高数据分析过程中的计算效率,对于未能正则化的模型,可以降低维度带来的过拟合
2、鸢尾花数据集
# 鸢尾花数据集LDA线性二分类
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_classificationclass LDA():def Train(self, X, y):"""X为训练数据集,y为训练label"""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])# 求中心点mju1 = np.mean(X1, axis=0) # mju1是ndrray类型mju2 = np.mean(X2, axis=0)# dot(a, b, out=None) 计算矩阵乘法cov1 = np.dot((X1 - mju1).T, (X1 - mju1))cov2 = np.dot((X2 - mju2).T, (X2 - mju2))Sw = cov1 + cov2# 计算ww = np.dot(np.mat(Sw).I, (mju1 - mju2).reshape((len(mju1), 1)))# 记录训练结果self.mju1 = mju1 # 第1类的分类中心self.cov1 = cov1self.mju2 = mju2 # 第2类的分类中心self.cov2 = cov2self.Sw = Sw # 类内散度矩阵self.w = w # 判别权重矩阵def Test(self, X, y):"""X为测试数据集,y为测试label"""# 分类结果y_new = np.dot((X), self.w)# 计算fisher线性判别式nums = len(y)c1 = np.dot((self.mju1 - self.mju2).reshape(1, (len(self.mju1))), np.mat(self.Sw).I)c2 = np.dot(c1, (self.mju1 + self.mju2).reshape((len(self.mju1), 1)))c = 1/2 * c2 # 2个分类的中心h = y_new - c# 判别y_hat = []for i in range(nums):if h[i] >= 0:y_hat.append(0)else:y_hat.append(1)# 计算分类精度count = 0for i in range(nums):if y_hat[i] == y[i]:count += 1precise = count / nums# 显示信息print("测试样本数量:", nums)print("预测正确样本的数量:", count)print("测试准确度:", precise)return precise
if '__main__' == __name__:# 产生分类数据n_samples = 500X, y = make_classification(n_samples=n_samples, n_features=2, n_redundant=0, n_classes=2,n_informative=1, n_clusters_per_class=1, class_sep=0.5, random_state=10)# LDA线性判别分析(二分类)lda = LDA()# 60% 用作训练,40%用作测试Xtrain = X[:299, :]Ytrain = y[:299]Xtest = X[300:, :]Ytest = y[300:]lda.Train(Xtrain, Ytrain)precise = lda.Test(Xtest, Ytest)# 原始数据plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)plt.xlabel("x1")plt.ylabel("x2")plt.title("Test precise:" + str(precise))plt.show()
二分类结果如下:
2、月亮数据集
#月亮数据集二分类
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
class LDA():def Train(self, X, y):"""X为训练数据集,y为训练label"""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])# 求中心点mju1 = np.mean(X1, axis=0) # mju1是ndrray类型mju2 = np.mean(X2, axis=0)# dot(a, b, out=None) 计算矩阵乘法cov1 = np.dot((X1 - mju1).T, (X1 - mju1))cov2 = np.dot((X2 - mju2).T, (X2 - mju2))Sw = cov1 + cov2# 计算ww = np.dot(np.mat(Sw).I, (mju1 - mju2).reshape((len(mju1), 1)))# 记录训练结果self.mju1 = mju1 # 第1类的分类中心self.cov1 = cov1self.mju2 = mju2 # 第1类的分类中心self.cov2 = cov2self.Sw = Sw # 类内散度矩阵self.w = w # 判别权重矩阵def Test(self, X, y):"""X为测试数据集,y为测试label"""# 分类结果y_new = np.dot((X), self.w)# 计算fisher线性判别式nums = len(y)c1 = np.dot((self.mju1 - self.mju2).reshape(1, (len(self.mju1))), np.mat(self.Sw).I)c2 = np.dot(c1, (self.mju1 + self.mju2).reshape((len(self.mju1), 1)))c = 1/2 * c2 # 2个分类的中心h = y_new - c# 判别y_hat = []for i in range(nums):if h[i] >= 0:y_hat.append(0)else:y_hat.append(1)# 计算分类精度count = 0for i in range(nums):if y_hat[i] == y[i]:count += 1precise = count / (nums+0.000001)# 显示信息print("测试样本数量:", nums)print("预测正确样本的数量:", count)print("测试准确度:", precise)return precise
if '__main__' == __name__:# 产生分类数据X, y = make_moons(n_samples=100, noise=0.15, random_state=42)# LDA线性判别分析(二分类)lda = LDA()# 60% 用作训练,40%用作测试Xtrain = X[:60, :]Ytrain = y[:60]Xtest = X[40:, :]Ytest = y[40:]lda.Train(Xtrain, Ytrain)precise = lda.Test(Xtest, Ytest)# 原始数据plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)plt.xlabel("x1")plt.ylabel("x2")plt.title("Test precise:" + str(precise))plt.show()
月亮数据集二分类结果如下:
二、K-Means算法
1、K-Means算法
K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
在数据集中根据一定策略选择K个点作为每个簇的初始中心,然后观察剩余的数据,将数据划分到距离这K个点最近的簇中,也就是说将数据划分成K个簇完成一次划分,但形成的新簇并不一定是最好的划分,因此生成的新簇中,重新计算每个簇的中心点,然后在重新进行划分,直到每次划分的结果保持不变。在实际应用中往往经过很多次迭代仍然达不到每次划分结果保持不变,甚至因为数据的关系,根本就达不到这个终止条件,实际应用中往往采用变通的方法设置一个最大迭代次数,当达到最大迭代次数时,终止计算。
2、鸢尾花数据集
#鸢尾花数据集二分类
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[:] ##表示我们只取特征空间中的后两个维度
estimator = KMeans(n_clusters=5)#构造聚类器
estimator.fit(X)#聚类
label_pred = estimator.labels_ #获取聚类标签
#绘制k-means结果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
x3 = X[label_pred == 3]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')
plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker='*', label='label1')
#plt.scatter(x2[:, 0], x2[:, 1], c = "blue", marker='+', label='label2')
#plt.scatter(x3[:, 0], x3[:, 1], c = "yellow", marker='o', label='label3')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
plt.show()
二分类结果如下:
3、月亮数据集
#月亮数据集K-Means二分类
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import make_moons
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
estimator = KMeans(n_clusters=5)#构造聚类器
estimator.fit(X)#聚类
label_pred = estimator.labels_ #获取聚类标签
#绘制k-means结果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
x3 = X[label_pred == 3]
plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')
plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker='*', label='label1')
#plt.scatter(x2[:, 0], x2[:, 1], c = "blue", marker='+', label='label2')
#plt.scatter(x3[:, 0], x3[:, 1], c = "yellow", marker='o', label='label3')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.legend(loc=2)
plt.show()
二分类结果如下:
三、SVM算法
1、SVM算法
Svm(support Vector Mac)又称为支持向量机,是一种二分类的模型。当然如果进行修改之后也是可以用于多类别问题的分类。支持向量机可以分为线性核非线性两大类。其主要思想为找到空间中的一个更够将所有数据样本划开的超平面,并且使得本本集中所有数据到这个超平面的距离最短。
2、鸢尾花数据集
# 鸢尾花数据集SVM算法二分类
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets, svm
import pandas as pd
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
iris = datasets.load_iris()
iris = datasets.load_iris()
X = iris.data
y = iris.target
X = X[y != 0, :2] # 选择X的前两个特性
y = y[y != 0]
n_sample = len(X)
np.random.seed(0)
order = np.random.permutation(n_sample) # 排列,置换
X = X[order]
y = y[order].astype(np.float)
X_train = X[:int(.9 * n_sample)]
y_train = y[:int(.9 * n_sample)]
X_test = X[int(.9 * n_sample):]
y_test = y[int(.9 * n_sample):]
#合适的模型
for fig_num, kernel in enumerate(('linear', 'rbf','poly')): # 径向基函数 (Radial Basis Function 简称 RBF),常用的是高斯基函数clf = svm.SVC(kernel=kernel, gamma=10) # gamma是“rbf”、“poly”和“sigmoid”的核系数。clf.fit(X_train, y_train)plt.figure(str(kernel))plt.xlabel('x1')plt.ylabel('x2')plt.scatter(X[:, 0], X[:, 1], c=y, zorder=10, cmap=plt.cm.Paired, edgecolor='k', s=20)# zorder: z方向上排列顺序,数值越大,在上方显示# paired两个色彩相近输出(paired)# 圈出测试数据plt.scatter(X_test[:, 0], X_test[:, 1], s=80, facecolors='none',zorder=10, edgecolor='k')plt.axis('tight') #更改 x 和 y 轴限制,以便显示所有数据x_min = X[:, 0].min()x_max = X[:, 0].max()y_min = X[:, 1].min()y_max = X[:, 1].max()XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j] Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()]) # 样本X到分离超平面的距离Z = Z.reshape(XX.shape)plt.contourf(XX,YY,Z>0,cmap=plt.cm.Paired) plt.contour(XX, YY, Z, colors=['r', 'k', 'b'],linestyles=['--', '-', '--'], levels=[-0.5, 0, 0.5]) # 范围plt.title(kernel)
plt.show()
二分类结果如下图:
3、月亮数据集
# 月亮数据集SVM二分类
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
import numpy as np
import matplotlib as mpl
from sklearn.datasets import make_moons
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
# 为了显示中文
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
def plot_dataset(X, y, axes):plt.plot(X[:, 0][y==0], X[:, 1][y==0], "bs")plt.plot(X[:, 0][y==1], X[:, 1][y==1], "g^")plt.axis(axes)plt.grid(True, which='both')plt.xlabel(r"$x_1$", fontsize=20)plt.ylabel(r"$x_2$", fontsize=20, rotation=0)plt.title("月亮数据",fontsize=20)
plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
polynomial_svm_clf = Pipeline([# 将源数据 映射到 3阶多项式("poly_features", PolynomialFeatures(degree=3)),# 标准化("scaler", StandardScaler()),# SVC线性分类器("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42))])
polynomial_svm_clf.fit(X, y)
def plot_predictions(clf, axes):# 打表x0s = np.linspace(axes[0], axes[1], 100)x1s = np.linspace(axes[2], axes[3], 100)x0, x1 = np.meshgrid(x0s, x1s)X = np.c_[x0.ravel(), x1.ravel()]y_pred = clf.predict(X).reshape(x0.shape)y_decision = clf.decision_function(X).reshape(x0.shape)
# print(y_pred)
# print(y_decision) plt.contourf(x0, x1, y_pred, cmap=plt.cm.brg, alpha=0.2)plt.contourf(x0, x1, y_decision, cmap=plt.cm.brg, alpha=0.1)
plot_predictions(polynomial_svm_clf, [-1.5, 2.5, -1, 1.5])
plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])
plt.show()
程序运行结果如下:
from sklearn.svm import SVC
gamma1, gamma2 = 0.1, 5
C1, C2 = 0.001, 1000
hyperparams = (gamma1, C1), (gamma1, C2)
svm_clfs = []
for gamma, C in hyperparams:rbf_kernel_svm_clf = Pipeline([("scaler", StandardScaler()),("svm_clf", SVC(kernel="rbf", gamma=gamma, C=C))])rbf_kernel_svm_clf.fit(X, y)svm_clfs.append(rbf_kernel_svm_clf)
plt.figure(figsize=(11, 7))
for i, svm_clf in enumerate(svm_clfs):plt.subplot(221 + i)plot_predictions(svm_clf, [-1.5, 2.5, -1, 1.5])plot_dataset(X, y, [-1.5, 2.5, -1, 1.5])gamma, C = hyperparams[i]plt.title(r"$\gamma = {}, C = {}$".format(gamma, C), fontsize=16)
plt.tight_layout()
plt.show()
程序运行结果如下:
四、SVM算法优缺点
1、优点
(1)SVM算法既可以解决线性问题,又可以解决非线性问题
(2)非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射
(3)对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心
(4)支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量
2、缺点
(1)对参数调节和核函数的选择敏感
(2)不易处理多分类问题
(3)对大规模训练样本难以实施
(4)SVM的可解释性较差,无法给出决策树那样的规则
鸢尾花数据集、月亮数据集二分类可视化分析相关推荐
- 对鸢尾花数据集和月亮数据集,分别采用线性LDA、k-means和SVM算法进行二分类可视化分析
一.支持向量机 支持向量机是一个功能强大并且全面的机器学习模型,它可以执行线性或者非线性分类,回归甚至异常检测任务.其主要分为三类:线性SVM分类.软间隔分类.非线性SVM分类. 本篇博客将重点深入S ...
- Dataset:titanic泰坦尼克号数据集/泰坦尼克数据集(是否获救二分类预测)的简介、下载、案例应用之详细攻略
Dataset:titanic泰坦尼克号数据集/泰坦尼克数据集(是否获救二分类预测)的简介.下载.案例应用之详细攻略 目录 titanic(泰坦尼克号)数据集的简介 1.titanic数据集各字段描述 ...
- R语言将多分类数据集转化为二分类数据集,使用条件判断将多分类转化为二分类(transform dataset into a dichotomous factor response dataset)
R语言将多分类数据集转化为二分类数据集,使用条件判断将多分类转化为二分类(transform dataset into a dichotomous factor response dataset) 目 ...
- ML之FE:对人类性别相关属性数据集进行数据特征分布可视化分析与挖掘
ML之FE:对人类性别相关属性数据集进行数据特征分布可视化分析与挖掘 目录 对人类性别相关属性数据集进行数据特征分布可视化分析与挖掘 输出结果 实现代码 对人类性别相关属性数据集进行数据特征分布可视化 ...
- GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析
GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析 文章目录 GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析 SetUp,库声明 数据准 ...
- JVM进阶(十二)——JAVA 可视化分析工具
JVM进阶(十二)--JAVA 可视化分析工具 经过前几篇博文对堆内存以及垃圾收集机制的学习,相信小伙伴们已经建立了一套比较完整的理论体系!本篇博客就根据已有的理论知识,通过可视化工具来实践一番. ...
- IMDB数据集——文本情绪二分类
文章目录 1.数据集及问题简介 2.加载数据集并探索数据 3.准备输入的数据 4.构建网络 5.编译网络 6.从训练集中留出验证集 7.训练模型 8.画出训练数据 9.根据训练数据,重新训练模型并测试 ...
- 【机器学习11】LAD,K-means,SVM分析鸢尾花和月亮数据集
1.LDA+鸢尾花 import numpy as np import matplotlib.pyplot as plt from sklearn import datasetsdef LDA(X, ...
- 【机器学习】SVM支持向量机在手写体数据集上进行二分类、采⽤ hinge loss 和 cross-entropy loss 的线性分类模型分析和对比、网格搜索
2022Fall 机器学习 1. 实验要求 考虑两种不同的核函数:i) 线性核函数; ii) ⾼斯核函数 可以直接调⽤现成 SVM 软件包来实现 ⼿动实现采⽤ hinge loss 和 cross-e ...
最新文章
- Qt中文手册 之 QHeaderView
- 给自己出的iOS面试题
- 2020-07-15 CVPR2020 表示学习论文讨论(4) 笔记
- 使用flush-logs命令重新生成MySQL的相关日志文件
- 【CTSC2010】珠宝商【后缀自动机】【点分治】【根号分治】
- spring data jpa update
- WIN7系统程序放在中文文件夹打开报错及界面汉字变乱码
- android 判断listview是否为空,ListView为空时显示空视图
- 电子科大考研计算机考研经验,电子科技大学
- 【翻译】PHP中 文字编码变换时 使用SJIS-win而非SJIS,使用eucJP-win而非EUC-JP
- 数据平滑处理——log1p()和exmp1()
- 『运维自媒体联盟』限时特供学习资源大礼包
- python气象卫星云图解析_python下载卫星云图合成gif
- python+Django搭建web服务器
- 如何将GitHub上的项目或代码文件下载到本地,并且上传自己的代码
- 修复 重装 远程桌面工具(mstsc.exe)完美解决方案
- 计算机专业教语文,中职计算机专业语文信息化教学应用
- 方格1010+颠覆经典俄罗斯方块逻辑玩法的手游
- 高考志愿填报网站服务器,高考后填报志愿必须遵守的原则
- 酷狗音乐皮肤怎么从计算机里换,酷狗音乐该怎样换皮肤?