1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > matlab鸢尾花数据线性分析 Iris鸢尾花数据集可视化 线性回归 决策树分析 KMeans聚类分析...

matlab鸢尾花数据线性分析 Iris鸢尾花数据集可视化 线性回归 决策树分析 KMeans聚类分析...

时间:2018-06-17 09:51:36

相关推荐

matlab鸢尾花数据线性分析 Iris鸢尾花数据集可视化 线性回归 决策树分析 KMeans聚类分析...

数据集可视化

采用Python的Sklearn机器学习库中自带的数据集——鸢尾花数据集。简单分析数据集之间特征的关系图,根据花瓣长度、花瓣宽度、花萼长度、花萼宽度四个特征进行绘图

Iris plants 数据集可以从KEEL dataset数据集网站获取,也可以直接从Sklearn.datasets机器学习包得到。数据集共包含4个特征变量、1个类别变量,共有150个样本。类别变量分别对应鸢尾花的三个亚属,分别是山鸢尾 (Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica) 分别用[0,1,2]来做映射

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets import load_iris #导入数据集iris

%matplotlib inline

iris = load_iris() #载入数据集

print(iris.data) #打印输出显示

image.png

print(iris.target) #共150条记录,分别代表50条山鸢尾 (Iris-setosa)、变色鸢尾(Iris-versicolor)、维吉尼亚鸢尾(Iris-virginica)

image.png

iris.data.shape # iris数据集150行4列的二维数组

image.png

url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']

dataset = pd.read_csv(url, names=names)

dataset.hist() #数据直方图histograms

image.png

print(dataset.describe())

image.png

dataset.plot(x='sepal-length', y='sepal-width', kind='scatter') #散点图,x轴表示sepal-length花萼长度,y轴表示sepal-width花萼宽度

image.png

dataset.plot(kind='kde') #KDE图,KDE图也被称作密度图(Kernel Density Estimate,核密度估计)

image.png

#kind='box'绘制箱图,包含子图且子图的行列布局layout为2*2,子图共用x轴、y轴刻度,标签为False

dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)

image.png

RadViz是一种可视化多维数据的方式。它基于基本的弹簧压力最小化算法(在复杂网络分析中也会经常应用)。简单来说,将一组点放在一个平面上,每一个点代表一个属性,我们案例中有四个点,被放在一个单位圆上,接下来你可以设想每个数据集通过一个弹簧联接到每个点上,弹力和他们属性值成正比(属性值已经标准化),数据集在平面上的位置是弹簧的均衡位置。不同类的样本用不同颜色表示

from pandas.tools.plotting import radviz

radviz(dataset,'class')

image.png

Andrews曲线将每个样本的属性值转化为傅里叶序列的系数来创建曲线。通过将每一类曲线标成不同颜色可以可视化聚类数据,属于相同类别的样本的曲线通常更加接近并构成了更大的结构。

from pandas.tools.plotting import andrews_curves

andrews_curves(dataset,'class')

image.png

平行坐标也是一种多维可视化技术。它可以看到数据中的类别以及从视觉上估计其他的统计量。使用平行坐标时,每个点用线段联接。每个垂直的线代表一个属性。一组联接的线段表示一个数据点。可能是一类的数据点会更加接近。

from pandas.tools.plotting import parallel_coordinates

parallel_coordinates(dataset,'class')

image.png

scatter_matrix散点矩阵图代表了两变量的相关程度,如果呈现出沿着对角线分布的趋势,说明它们的相关性较高。

from pandas.tools.plotting import scatter_matrix

scatter_matrix(dataset, alpha=0.2, figsize=(6, 6), diagonal='kde')

image.png

因素分析最初心理学家斯皮尔曼发明,用于研究人类的人格特质,著名的卡特尔16PF(16种相对独立的人格特征)就是应用因素分析方法得来。基于高斯潜在变量的一个简单线性模型,假设每一个观察值都是由低维的潜在变量加正态噪音构成。

from sklearn import decomposition

pca = decomposition.FactorAnalysis(n_components=2)

X = pca.fit_transform(dataset.ix[:,:-1].values)

pos = pd.DataFrame()

pos['X'] = X[:,0]

pos['Y'] = X[:,1]

pos['class'] = dataset['class']

ax = pos.ix[pos['class']=='Iris-virginica'].plot(kind='scatter', x='X', y='Y', color='blue', label='Iris-virginica')

ax = pos.ix[pos['class']=='Iris-setosa'].plot(kind='scatter', x='X', y='Y', color='green', label='Iris-setosa', ax=ax)

ax = pos.ix[pos['class']=='Iris-versicolor'].plot(kind='scatter', x='X', y='Y', color='red', label='Iris-versicolor', ax=ax)

image.png

主成分分析是由因子分析进化而来的一种降维的方法,通过正交变换将原始特征转换为线性独立的特征,转换后得到的特征被称为主成分。主成分分析可以将原始维度降维到n个维度,有一个特例情况,就是通过主成分分析将维度降低为2维,这样的话,就可以将多维数据转换为平面中的点,来达到多维数据可视化的目的。

from sklearn import decomposition

pca = decomposition.PCA(n_components=2)

X = pca.fit_transform(dataset.ix[:,:-1].values)

pos = pd.DataFrame()

pos['X'] = X[:,0]

pos['Y'] = X[:,1]

pos['class'] = dataset['class']

ax = pos.ix[pos['class']=='Iris-virginica'].plot(kind='scatter', x='X', y='Y', color='blue', label='Iris-virginica')

ax = pos.ix[pos['class']=='Iris-setosa'].plot(kind='scatter', x='X', y='Y', color='green', label='Iris-setosa', ax=ax)

ax = pos.ix[pos['class']=='Iris-versicolor'].plot(kind='scatter', x='X', y='Y', color='red', label='Iris-versicolor', ax=ax)

image.png

独立成分分析将多源信号拆分成最大可能独立性的子成分,它最初不是用来降维,而是用于拆分重叠的信号。

from sklearn import decomposition

pca = decomposition.FastICA(n_components=2)

X = pca.fit_transform(dataset.ix[:,:-1].values)

pos = pd.DataFrame()

pos['X'] = X[:,0]

pos['Y'] = X[:,1]

pos['class'] = dataset['class']

ax = pos.ix[pos['class']=='Iris-virginica'].plot(kind='scatter', x='X', y='Y', color='blue', label='Iris-virginica')

ax = pos.ix[pos['class']=='Iris-setosa'].plot(kind='scatter', x='X', y='Y', color='green', label='Iris-setosa', ax=ax)

ax = pos.ix[pos['class']=='Iris-versicolor'].plot(kind='scatter', x='X', y='Y', color='red', label='Iris-versicolor', ax=ax)

image.png

多维量表试图寻找原始高维空间数据的距离的良好低维表征。简单来说,多维度量尺被用于数据的相似性,它试图用几何空间中的距离来建模数据的相似性,直白来说就是用二维空间中的距离来表示高维空间的关系。数据可以是物体之间的相似度、分子之间的交互频率或国家间交易指数。这一点与前面的方法不同,前面的方法的输入都是原始数据,而在多维度量尺的例子中,输入是基于欧式距离的距离矩阵。多维度量尺算法是一个不断迭代的过程,因此,需要使用max_iter来指定最大迭代次数,同时计算的耗时也是上面算法中最大的一个

from sklearn import manifold

from sklearn.metrics import euclidean_distances

similarities = euclidean_distances(dataset.ix[:,:-1].values)

mds = manifold.MDS(n_components=2, max_iter=3000, eps=1e-9, dissimilarity='precomputed', n_jobs=1)

X = mds.fit(similarities).embedding_

pos = pd.DataFrame(X, columns=['X','Y'])

pos['class'] = dataset['class']

ax = pos.ix[pos['class']=='Iris-virginica'].plot(kind='scatter', x='X', y='Y', color='blue', label='Iris-virginica')

ax = pos.ix[pos['class']=='Iris-setosa'].plot(kind='scatter', x='X', y='Y', color='green', label='Iris-setosa', ax=ax)

ax = pos.ix[pos['class']=='Iris-versicolor'].plot(kind='scatter', x='X', y='Y', color='red', label='Iris-versicolor', ax=ax)

image.png

线性回归

采用线性回归算法对鸢尾花的特征数据进行分析,预测花瓣长度、花瓣宽度、花萼长度、花萼宽度四个特征之间的线性关系。该部分的核心代码:

pos = pd.DataFrame(dataset)

#获取花瓣的长和宽,转换Series为ndarray

x = pos['petal-length'].values

y = pos['petal-width'].values

x = x.reshape(len(x),1)

y = y.reshape(len(y),1)

from sklearn.linear_model import LinearRegression

clf = LinearRegression()

clf.fit(x,y)

pre = clf.predict(x)

plt.scatter(x,y,s=100)

plt.plot(x,pre,'r-',linewidth=4)

for idx, m in enumerate(x):

plt.plot([m,m],[y[idx],pre[idx]], 'g-')

plt.show()

image.png

print(u"系数", clf.coef_ )

print(u"截距", clf.intercept_ )

print(np.mean(y-pre)**2 )

image.png

假设现在存在一个花瓣长度为5.0的花,需要预测其花瓣宽度,则使用该已经训练好的线性回归模型进行预测,其结果应为[ 1.71558162]

print(clf.predict([[5.0]]) )

image.png

pos = pd.DataFrame(dataset)

#获取花萼的长和宽,转换Series为ndarray

x = pos['sepal-length'].values

y = pos['sepal-width'].values

x = x.reshape(len(x),1)

y = y.reshape(len(y),1)

from sklearn.linear_model import LinearRegression

clf = LinearRegression()

clf.fit(x,y)

pre = clf.predict(x)

plt.scatter(x,y,s=100)

plt.plot(x,pre,'r-',linewidth=4)

for idx, m in enumerate(x):

plt.plot([m,m],[y[idx],pre[idx]], 'g-')

plt.show()

image.png

print(u"系数", clf.coef_ )

print(u"截距", clf.intercept_ )

print(np.mean(y-pre)**2 )

image.png

假设现在存在一个花萼长度为5.0的花,需要预测其花萼宽度,则使用该已经训练好的线性回归模型进行预测,其结果应为[3.10229621]

print(clf.predict([[5.0]]) )

image.png

决策树分析

Sklearn机器学习包中,决策树实现类是DecisionTreeClassifier,能够执行数据集的多类分类。

from sklearn.datasets import load_iris

from sklearn.tree import DecisionTreeClassifier

iris = load_iris()

clf = DecisionTreeClassifier()

clf.fit(iris.data, iris.target)

predicted = clf.predict(iris.data)

#获取花卉两列数据集

L1 = pos['sepal-length'].values

L2 = pos['sepal-width'].values

import numpy as np

import matplotlib.pyplot as plt

plt.scatter(L1, L2, c=predicted, marker='x') #cmap=plt.cm.Paired

plt.title("DTC")

plt.show()

image.png

将iris_data分为70%的训练,30%的进行预测 然后进行优化 输出准确率、召回率等,优化后的完整代码如下:

from sklearn.tree import DecisionTreeClassifier

from sklearn.model_selection import train_test_split

from sklearn import metrics

x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target, test_size=0.3)

clf = DecisionTreeClassifier()

clf.fit(x_train,y_train)

predict_target = clf.predict(x_test)

print(sum(predict_target == y_test)) #预测结果与真实结果比对

print(metrics.classification_report(y_test,predict_target))

print(metrics.confusion_matrix(y_test,predict_target))

L1 = [n[0] for n in x_test]

L2 = [n[1] for n in x_test]

plt.scatter(L1,L2, c=predict_target,marker='x')

plt.title('DecisionTreeClassifier')

plt.show()

image.png

KMeans 聚类分析

from sklearn.cluster import KMeans

from sklearn.datasets import load_iris

iris = load_iris()

clf = KMeans()

clf.fit(iris.data,iris.target)

predicted = clf.predict(iris.data)

pos = pd.DataFrame(dataset)

L1 = pos['sepal-length'].values

L2 = pos['sepal-width'].values

plt.scatter(L1, L2, c=predicted, marker='s',s=100,cmap=plt.cm.Paired)

plt.title("KMeans")

plt.show()

image.png

from sklearn.datasets import load_iris

from sklearn.tree import DecisionTreeClassifier

# Parameters

n_classes = 3

plot_colors = "ryb"

plot_step = 0.02

# Load data

iris = load_iris()

for pairidx, pair in enumerate([[0, 1], [0, 2], [0, 3],

[1, 2], [1, 3], [2, 3]]):

# We only take the two corresponding features

X = iris.data[:, pair]

y = iris.target

# Train

clf = DecisionTreeClassifier().fit(X, y)

# Plot the decision boundary

plt.subplot(2, 3, pairidx + 1)

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1

y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1

xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),

np.arange(y_min, y_max, plot_step))

plt.tight_layout(h_pad=0.5, w_pad=0.5, pad=2.5)

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

cs = plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu)

plt.xlabel(iris.feature_names[pair[0]])

plt.ylabel(iris.feature_names[pair[1]])

# Plot the training points

for i, color in zip(range(n_classes), plot_colors):

idx = np.where(y == i)

plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i],

cmap=plt.cm.RdYlBu, edgecolor='black', s=15)

plt.suptitle("Decision surface of a decision tree using paired features")

plt.legend(loc='lower right', borderpad=0, handletextpad=0)

plt.axis("tight")

plt.show()

image.png

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。