1,極大似然估計的過程
先假定類別c的類條件概率p(x|c)具有某種確定的概率分布形式(如正態分佈),再基於對訓練樣本對概率分布的引數(如u, σ^2)進行估計。具體步驟:
寫出似然函式
取對數求偏導,令偏導為0
得出最大似然估計的引數值
2,kmeans理論基礎、理論依據
演算法屬性:
無監督的聚類演算法
演算法思想:
對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為k個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大。
演算法過程:
選擇k個點作為初始質心
repeat
將每個點指派到最近的質心,形成k個簇
重新計算每個簇的質心
until 簇不發生變化或達到最大迭代次數
演算法實現:
參考:
import numpy as np
# 載入資料
def loaddataset(filename):
data = np.loadtxt(filename,delimiter='\t')
return data
# 歐氏距離計算
def disteclud(x,y):
return np.sqrt(np.sum((x-y)**2)) # 計算歐氏距離
# 為給定資料集構建乙個包含k個隨機質心的集合
def randcent(dataset,k):
m,n = dataset.shape
centroids = np.zeros((k,n))
for i in range(k):
index = int(np.random.uniform(0,m)) #
centroids[i,:] = dataset[index,:]
return centroids
# k均值聚類
def kmeans(dataset,k):
m = np.shape(dataset)[0] #行的數目
# 第一列存樣本屬於哪一簇
# 第二列存樣本的到簇的中心點的誤差
clusterassment = np.mat(np.zeros((m,2)))
clusterchange = true
# 第1步 初始化centroids
centroids = randcent(dataset,k)
while clusterchange:
clusterchange = false
# 遍歷所有的樣本(行數)
for i in range(m):
mindist = 100000.0
minindex = -1
# 遍歷所有的質心
#第2步 找出最近的質心
for j in range(k):
# 計算該樣本到質心的歐式距離
distance = disteclud(centroids[j,:],dataset[i,:])
if distance < mindist:
mindist = distance
minindex = j
# 第 3 步:更新每一行樣本所屬的簇
if clusterassment[i,0] != minindex:
clusterchange = true
clusterassment[i,:] = minindex,mindist**2
#第 4 步:更新質心
for j in range(k):
pointsincluster = dataset[np.nonzero(clusterassment[:,0].a == j)[0]] # 獲取簇類所有的點
centroids[j,:] = np.mean(pointsincluster,axis=0) # 對矩陣的行求均值
return centroids,clusterassment
3,em演算法
演算法用途:
處理缺損資料,截尾資料,帶有雜訊等所謂的不完全資料。
演算法過程:
第一步(期望,e步):利用當前估計的引數值計算對數似然的期望值
第二步(最大化,m步):尋找能使e步的似然期望最大化的引數值
重複e步、m步,直至收斂到區域性最優解。
演算法實現:
參考:
import math
import copy
import numpy as np
import matplotlib.pyplot as plt
isdebug = false
# 指定k個高斯分布引數,這裡指定k=2。注意2個高斯分布具有相同均方差sigma,分別為mu1,mu2。
def ini_data(sigma, mu1, mu2, k, n):
global x # x產生的資料 ,k維向量
global mu # 初始均值
global expectations
x = np.zeros((1, n))
mu = np.random.random(2) # 隨機產生乙個初始均值。
expectations = np.zeros((n, k)) # k個高斯分布,100個二維向量組成的矩陣。
for i in range(0, n):
if np.random.random(1) > 0.5:
# 隨機從均值為mu1,mu2的分布中取樣。
x[0, i] = np.random.normal() * sigma + mu1
else:
x[0, i] = np.random.normal() * sigma + mu2
if isdebug:
print("***********")
print(u"初始觀測資料x:")
print(x)
# em演算法:步驟1,計算e[zij]
def e_step(sigma, k, n):
# 求期望。sigma協方差,k高斯混合模型數,n資料個數。
global expectations # n個k維向量
global mu
global x
for i in range(0, n):
denom = 0
for j in range(0, k):
denom += math.exp((-1 / (2 * (float(sigma ** 2)))) * (float(x[0, i] - mu[j])) ** 2)
# denom 分母項 mu(j)第j個高斯分布的均值。
for j in range(0, k):
numer = math.exp((-1 / (2 * (float(sigma ** 2)))) * (float(x[0, i] - mu[j])) ** 2) # 分子項
expectations[i, j] = numer / denom # 期望,計算出每乙個高斯分布所佔的期望,即該高斯分布以多大比例形成這個樣本
# em演算法:步驟2,求最大化e[zij]的引數mu
def m_step(k, n):
# 最大化
global expectations # 期望值
global x # 資料
for j in range(0, k):
# 遍歷k個高斯混合模型資料
numer = 0 # 分子項
denom = 0 # 分母項
for i in range(0, n):
numer += expectations[i, j] * x[0, i] # 每乙個高斯分布的期望*該樣本的值。
denom += expectations[i, j] # 第j個高斯分布的總期望值作為分母
mu[j] = numer / denom # 第j個高斯分布新的均值,
# 演算法迭代iter_num次,或達到精度epsilon停止迭代
def run(sigma, mu1, mu2, k, n, iter_num, epsilon):
ini_data(sigma, mu1, mu2, k, n)
print(x)
print(u"初始:", mu) # 初始均值
for i in range(iter_num):
old_mu = copy.deepcopy(mu) # 演算法之前的mu
e_step(sigma, k, n)
m_step(k, n)
print(i, mu) # 經過em演算法之後的mu,
if sum(abs(mu - old_mu)) < epsilon:
break
if __name__ == '__main__':
run(6, 40, 20, 2, 100, 100, 0.001)
plt.hist(x[0, :], 50)
plt.show()
4,資料探勘十大演算法: SPSS Modeler資料探勘 資料探勘概述
資料探勘 是一種通過數理模式來分析大量資料,以找出不同的客戶或市場劃分,分析出消費者喜好和行為的方法。可以描述為 是按企業既定業務目標,對大量的企業資料進行探索和分析,揭示隱藏的 未知的 或驗證已知的規律性,並進一步將其模型化的先進的有效的方法。資料探勘 data mining 在技術上的定義是從大...
資料探勘 資料
對關注的屬性,樣本與原始資料集有相同的性質,則用抽樣計算的結果與全集是一樣。1.1 抽樣的方法 1 簡單隨機抽樣 random sampling 放回 不放回 2 分層抽樣 stratified sampling 如果資料集不同型別的資料數量差異過大,則隨機抽樣會丟失數量少的樣本。可針對不同資料組,...
資料探勘 關聯規則挖掘
關聯規則 association rule 是資料中所蘊含的一類重要規律。關聯規則挖掘的目標是在資料專案中找出所有的併發關係 cooccurrence relationships 這種關係也稱為關聯 association 關聯規則挖掘的經典應用是購物籃 market basket 關聯規則挖掘並沒...