對鳶尾花數據集和月亮數據集用LDA、k-means和SVM進行二分類可視化分析

一.鳶尾花數據集算法可視化

1.LDA對鳶尾花數據集聚類

代碼如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

def LDA(X, y):
    #根據y等於0或1分類
    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) 
    mju1 = np.mean(X1, axis=0)#求中心點
    mju2 = np.mean(X2, axis=0)
    cov1 = np.dot((X1 - mju1).T, (X1 - mju1))
    cov2=np.dot((X2 - mju2).T, (X2 - mju2))
    Sw = cov1 + cov2
    a=mju1-mju2
    a=(np.array([a])).T
    #計算w
    w=(np.dot(np.linalg.inv(Sw),a))
    #計算投影直線
    #k=w[1]/w[0]
    #b=0;
    #x=np.arange(0,5)
    #yy=k*x+b
    #plt.plot(x,yy)
    X1_new =func(X1, w)
    X2_new = func(X2, w)
    y1_new = [1 for i in range(len1)]
    y2_new = [2 for i in range(len2)]
    return X1_new,X2_new,y1_new,y2_new
def func(x, w):
    return np.dot((x), w)

iris = datasets.load_iris()
X = iris["data"][:, (2, 3)]  # 花瓣長度與花瓣寬度  petal length, petal width
y = iris["target"]
#print(y)
setosa_or_versicolor = (y == 0) | (y == 1)
X = X[setosa_or_versicolor]
y = y[setosa_or_versicolor]
#print(Sw)
x1_new, X2_new, y1_new, y2_new = LDA(X, y)
plt.xlabel('花瓣長度')
plt.ylabel('花瓣寬度')
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
plt.show()

結果:
在這裏插入圖片描述

2.k-means對鳶尾花數據集聚類

代碼:

from sklearn.cluster import KMeans
#加載數據集
lris_df = datasets.load_iris()
#print(lris_df) 
#挑選第2列,花瓣的長度
x_axis = lris_df.data[:,2]
#print(x_axis)
#挑選第三列,花瓣的寬度
y_axis = lris_df.data[:,3]
#print(y_axis)
#這裏已經知道了分2類,其他分類這裏的參數需要調試
model = KMeans(n_clusters=2)
#訓練模型
model.fit(lris_df.data)
prddicted_label= model.predict([[6.3, 3.3, 6, 2.5]])
all_predictions = model.predict(lris_df.data)
#plt.plot(a, b, "bs")
plt.xlabel('花瓣的長度')
plt.ylabel('花瓣的寬度')
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
#打印出來對150條數據的聚類散點圖
plt.scatter(x_axis, y_axis, c=all_predictions)
plt.show()

結果:
在這裏插入圖片描述

3.SVM對鳶尾花數據集聚類

代碼:

from sklearn.svm import SVC
iris = datasets.load_iris()
X = iris["data"][:, (2, 3)]  # 花瓣長度與花瓣寬度  petal length, petal width
y = iris["target"]
setosa_or_versicolor = (y == 0) | (y == 1)
X = X[setosa_or_versicolor]
y = y[setosa_or_versicolor]
# SVM Classifier model
svm_clf = SVC(kernel="linear", C=float("inf"))
svm_clf.fit(X, y)
def plot_svc_decision_boundary(svm_clf, xmin, xmax):
    # 獲取決策邊界的w和b
    w = svm_clf.coef_[0]
    b = svm_clf.intercept_[0]

    # At the decision boundary, w0*x0 + w1*x1 + b = 0
    # => x1 = -w0/w1 * x0 - b/w1
    x0 = np.linspace(xmin, xmax, 200)
    # 畫中間的粗線
    decision_boundary = -w[0]/w[1] * x0 - b/w[1]
    # 計算間隔
    margin = 1/w[1]
    gutter_up = decision_boundary + margin
    gutter_down = decision_boundary - margin
    # 獲取支持向量
    svs = svm_clf.support_vectors_
    plt.scatter(svs[:, 0], svs[:, 1], s=180, facecolors='#FFAAAA')
    plt.plot(x0, decision_boundary, "k-", linewidth=2)
    plt.plot(x0, gutter_up, "k--", linewidth=2)
    plt.plot(x0, gutter_down, "k--", linewidth=2)
plt.title("大間隔分類", fontsize=16)
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
plot_svc_decision_boundary(svm_clf, 0, 5.5)
plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs")
plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo")
plt.xlabel("Petal length", fontsize=14)
plt.axis([0, 5.5, 0, 2])
plt.show()

結果:
在這裏插入圖片描述

二.月亮數據集算法可視化

1.LDA對月亮數據集聚類

代碼:

def LDA(X, y):
    #根據y等於0或1分類
    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) 
    mju1 = np.mean(X1, axis=0)#求中心點
    mju2 = np.mean(X2, axis=0)
    cov1 = np.dot((X1 - mju1).T, (X1 - mju1))
    cov2=np.dot((X2 - mju2).T, (X2 - mju2))
    Sw = cov1 + cov2
    a=mju1-mju2
    a=(np.array([a])).T
    w=(np.dot(np.linalg.inv(Sw),a))
    X1_new =func(X1, w)
    X2_new = func(X2, w)
    y1_new = [1 for i in range(len1)]
    y2_new = [2 for i in range(len2)]
def func(x, w):
    return np.dot((x), w)
X, y = datasets.make_moons(n_samples=100, noise=0.15, random_state=42)
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
plt.show()

結果:
在這裏插入圖片描述

2.k-means對月亮數據集聚類

代碼:

from sklearn.datasets import make_moons
from sklearn.cluster import KMeans
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
#X是一個100X2維度的,分別選取兩列的數據
X1=X[:,0]
X2=X[:,1]
#這裏已經知道了分2類,其他分類這裏的參數需要調試
model = KMeans(n_clusters=2)
#訓練模型
model.fit(X)
#print(z[50])
#選取行標爲50的那條數據,進行預測
prddicted_label= model.predict([[-0.22452786,1.01733299]])
#預測全部100條數據
all_predictions = model.predict(X)
#plt.plot(a, b, "bs")
#打印聚類散點圖
plt.scatter(X1, X2, c=all_predictions)
plt.show()

結果:
在這裏插入圖片描述

3.SVM對月亮數據集聚類

代碼:

X, y = datasets.make_moons(n_samples=100, noise=0.15, random_state=42)
svm_clf = SVC(kernel="linear")
svm_clf.fit(X, y)
def plot_svc_decision_boundary(svm_clf, xmin, xmax):
    # 獲取決策邊界的w和b
    w = svm_clf.coef_[0]
    b = svm_clf.intercept_[0]
    x0 = np.linspace(xmin, xmax, 200)
    # 畫中間的粗線
    decision_boundary = -w[0]/w[1] * x0 - b/w[1]
    # 計算間隔
    margin = 1/w[1]
    gutter_up = decision_boundary + margin
    gutter_down = decision_boundary - margin
    # 獲取支持向量
    svs = svm_clf.support_vectors_
    plt.scatter(svs[:, 0], svs[:, 1], s=180, facecolors='#FFAAAA')
    plt.plot(x0, decision_boundary, "k-", linewidth=2)
    plt.plot(x0, gutter_up, "k--", linewidth=2)
    plt.plot(x0, gutter_down, "k--", linewidth=2)
plot_svc_decision_boundary(svm_clf, -2, 3)
plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs")
plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo")
plt.axis([-1, 2.5, -0.75, 1.25])
plt.show()


結果:
在這裏插入圖片描述

三.SVM算法的優缺點

優點:
1、使用核函數可以向高維空間進行映射
2、使用核函數可以解決非線性的分類
3、分類思想很簡單,就是將樣本與決策面的間隔最大化
4、分類效果較好
缺點:
1、對大規模數據訓練比較困難
2、無法直接支持多分類,但是可以使用間接的方法來做
參考鏈接個人博客鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章