自己計畫實現一遍模式識別裡的內容。
parzen窗估計是非引數估計。我在非引數技術——parzen窗估計方法文章和非引數估計-parzen視窗函式法文章裡面整理出了演算法基本過程:利用第一篇部落格給出的樣本資料對給定的資料進行分類。分類的方法就是根據公式分別求出對於三個類的數值。公式是
求出來數值之後,比較大小,給定資料屬於數值較大的一類。運算通過numpy包實現,通過迴圈得出數值,進行比較。
**實現如下,計算的結果和非引數技術——parzen窗估計方法文中給的內容基本一致。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
# parzen窗法
# 原始資料
# w1
data1=[[0.28,1.31,-6.2],
[0.07,0.58,-0.78],
[1.54,2.01,-1.63],
[-0.44,1.18,-4.32],
[-0.81,0.21,5.73],
[1.52,3.16,2.77],
[2.20,2.42,-0.19],
[0.91,1.94,6.21],
[0.65,1.93,4.38],
[-0.26,0.82,-0.96]
]w1=np.mat(data1)
# w2
data2=[[0.011,1.03,-0.21],
[1.27,1.28,0.08],
[0.13,3.12,0.16],
[-0.21,1.23,-0.11],
[-2.18,1.39,-0.19],
[0.34,1.96,-0.16],
[-1.38,0.94,0.45],
[-0.12,0.82,0.17],
[-1.44,2.31,0.14],
[0.26,1.94,0.08]
]w2=np.mat(data2)
# w3
data3=[[1.36,2.17,0.14],
[1.41,1.45,-0.38],
[1.22,0.99,0.69],
[2.46,2.19,1.31],
[0.68,0.79,0.87],
[2.51,3.22,1.35],
[0.60,2.44,0.92],
[0.64,0.13,0.97],
[0.85,0.58,0.99],
[0.66,0.51,0.88]
]w3=np.mat(data3)
#得到φ函式的結果
# 要是用np.mat建立矩陣,np.array是不行的,是陣列沒有轉置
def get_phi(x, xi, h):
x = np.mat(x)
xi = np.mat(xi)
phi = np.exp(-(x - xi) * (x - xi).t / (2 * h * h))
return phi
# 整體公式的算數
def get_px(x, xi, h):
phi = 0
n = len(xi)
for i in range(n):
# print("xi[i]", xi[i])
phi += get_phi(x, xi[i], h)
px = phi / ( n * np.power(h, 3))
return px
# 利用parzen窗判斷目標資料屬於哪個類
def parzen(h, test):
# 陣列用來比較結果屬於哪一類
px = [0, 0, 0]
# h的取值
print("h =", h)
px[0] = get_px(test,w1,h)
px[1] = get_px(test, w2, h)
px[2] = get_px(test, w3, h)
# 輸出一下計算結果,用來和已知內容比較
print("w1",px[0])
print("w2",px[1])
print("w3",px[2])
# 加乙個plt的圖形展示,可以顯示已經有的點和分類的點,正好自己不熟悉,練習一下
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(w1[:, 0], w1[:, 1], w1[:, 2], s=20, c='r')
ax.scatter(w2[:, 0], w2[:, 1], w2[:, 2], s=20, c='g')
ax.scatter(w3[:, 0], w3[:, 1], w3[:, 2], s=20, c='y')
if px[0] > px[1] :
if px[0] > px[2] :
print("屬於第一類")
ax.scatter(test[0], test[1], test[2], s=50, c='r')
else :
print("屬於第三類")
ax.scatter(test[0], test[1], test[2], s=50, c='y')
else :
if px[1] > px[2]:
print("屬於第二類")
ax.scatter(test[0], test[1], test[2], s=50, c='g')
else:
print("屬於第三類")
ax.scatter(test[0], test[1], test[2], s=50, c='y')
# xyz軸的名稱
ax.set_xlabel('x ')
ax.set_ylabel('y ')
ax.set_zlabel('z ')
# 標題名稱,有變數,向string一樣%s處理
plt.title("h=%s"%h)
plt.show()
# 計算
def main():
# 陣列分別為 [0.5, 1.0, 0.0] [0.31, 1.51, -0.50] [-0.3, 0.44, -0.1]
# 切換test的陣列內容可以測試每乙個資料
test=[0.31, 1.51, -0.50]
h1 = 1
h2 = 0.1
parzen(h1, test)
parzen(h2, test)
# 入口
if __name__ == '__main__':
main()
除了利用parzen窗判斷目標資料屬於哪個類,還把這些點和目標點用pyplot展示了一下,目標點會放大效果如下
模式識別 模式識別的概述(一)
模式和模式識別的概念 模式識別的發展簡史和應用 模式識別的主要方法 模式識別的系統和例項 幾個相關的數學概念 廣義地說,存在於時間和空間中可觀察的事物,如果我們可以區別他們是否相同或是否相似,都可以稱之為模式。模式所指的不是事物本身,而是從事物獲得的資訊,因此,模式往往表現為具有時間和空間分布的資訊...
模式識別學習筆記(一)模式識別初認識
這是本人第一次寫部落格,把學到的東西以及自己的理解用類似於學習筆記的形式表達出來。如果有不妥的地方,希望大家指正。謝謝!一 模式識別的定義 關於模式識別 pattern recognition 的定義,首先要了解模式和識別分別是什麼含義。有教材指出模式是指組成成分或影響因素間存在確定性或隨機性規律的...
模式識別課程筆記(一)
閱讀目錄 一 模式識別 pattern recognition 二 模式識別型別 三 模式識別系統 四 評價標準 一 模式識別 pattern recognition 人類在識別和分辨事物時,往往是在先驗知識和以往對此類事物的多個具體例項觀察基礎上產生的整體性質和特徵的認識。其實,每一種外界事物都可...