python-機器學習程式碼總結

weixin_44357667發表於2020-11-08

1、實現二維正態分佈(高斯分佈)

  1. 給定引數生成二維正態分佈,並求給定值下的概率密度
def getGauss(X,mean,cov):
    covv = np.array(cov)
    c1 = math.pow(np.linalg.det(covv),0.5)#求行列式
    c2 = np.linalg.inv(covv)#求逆
    XX = np.array(X)
    meann = np.array(mean)
    de = np.array(XX-meann)
    de1 = de.T
    p1 = np.dot(de1,c2)
    p2 = (-1)* np.dot(p1,de)/2
    p = math.pow(math.e,p2)/(2*math.pi*c1)
    return p
  1. 生成符合二維正態分佈的隨機數
import numpy as np
mean1 = [0, 0]
cov1 = [[1, 1], [1, 6]]
data = np.random.multivariate_normal(mean1, cov1, 100)
  1. 協方差矩陣
#得到協方差矩陣S
def getS(mean,data):
    sum = 0
    for i in range(len(data)):
        xx = np.array(data[i]) - np.array(mean)
        xxT = reshapelist(np.array(xx))
        sum = sum + np.dot(xxT,np.array([xx]))
    return (sum/len(data))

2、矩陣簡單運算

import numpy as np
lis = np.mat([[1,2,3],[3,4,5],[4,5,6]])
print(np.linalg.inv(lis))  # 求矩陣的逆矩陣

print(lis.transpose())  # 求矩陣的轉置矩陣

print(np.linalg.det(lis))  # 求矩陣的行列式

print(np.linalg.eig(lis))  # 求矩陣的特徵值與特徵向量,求得的元組中第一個為特徵值元組,第二個為相對應的特徵向量

eigenvalues, feature_vectors = np.linalg.eig(cov)  # 特徵值分解.得到特徵值和特徵向量

shape:

>>> c = array([[1,1],[1,2],[1,3],[1,4]])  
>>> c.shape  
(4, 2)  
>>> c.shape[0]  
4  
>>> c.shape[1]  
2  

3、隨機數

import random
 
# 產生 1 到 10 的一個整數型隨機數
print( random.randint(1,10) )        
# 產生 0 到 1 之間的隨機浮點數
print( random.random() )             
# 產生  1.1 到 5.4 之間的隨機浮點數,區間可以不是整數
print( random.uniform(1.1,5.4) )     
# 從序列中隨機選取一個元素
print( random.choice([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) )   
# 生成從1到100的間隔為2的隨機整數
print( random.randrange(1,100,2) )   
# 將序列a中的元素順序打亂
a=[1,3,5,6,7]                
random.shuffle([1,3,5,6,7])
print(a)

3、排序

x = np.array([1,4,3,-1,6,9])
x.argsort()
# array([3, 0, 1, 2, 4, 5], dtype=int64)
#取陣列最小值
x[x.argsort()[0]]
#最大值
x[x.argsort()[-1]]

4、 畫圖

import matplotlib.pyplot as plt
	colors1 = '#00CED1'  # 點的顏色
    colors2 = '#DC143C'
    colors3 = '#808080'
    colors4 = '#000080'
    for i in range(len(x)):
        if(abs(C[i]-0)<1e-10):
            plt.scatter(x[i], y[i],c=colors1)
        elif(abs(C[i]-1)<1e-10):
            plt.scatter(x[i], y[i], c=colors2)
        elif (abs(C[i]-2)<1e-10):
            plt.scatter(x[i], y[i], c=colors3)
        elif(abs(C[i]-3)<1e-10):
            plt.scatter(x[i], y[i], c=colors1)

    for i in range(len(mean)):
        plt.scatter(mean[i][0],mean[i][1],c=colors4)
	#plt.plot(xf, yf,label="M="+str(m-1)) #線圖
    plt.figure(figsize=(6, 4))
    plt.legend()  # 顯示圖例
    plt.show()  # 顯示畫圖

5、資料集來源

  1. UCI資料集:http://archive.ics.uci.edu/ml/datasets.php
  2. 人臉資料集:https://www.bioid.com/facedb/ (BioD人臉資料庫)
    BioD人臉資料庫pgm檔案讀取,顯示操作:
# 載入臉部資料.得到m*n的陣列。m*n為pgm檔案的畫素
def load_face_data(filepath):
    for dir_path, dir_names, file_names in os.walk(filepath):
        # walk() 函式記憶體放的是資料的絕對路徑,同時注意斜槓的方向。
        for fn in file_names:
            if fn[-3:] == 'pgm':
                image_filename = os.path.join(dir_path, fn)
                x = mh.imread(image_filename, as_grey=True)
                print(x.shape[0])
                #畫出影像
                plt.imshow(x)
                plt.axis('off')  # 不顯示座標軸
                plt.show()
    return x

用記事本開啟
在這裡插入圖片描述
P5為pgm檔案版本。
384 為生成陣列的列數。286 為生成陣列的行數。384*286為畫素
255為最大灰度

6、二維陣列的一些運算

#得到轉置後的陣列
def reserve(data):
    n = data.shape[0] #行數
    m = data.shape[1] #列數
    dataT = np.zeros((m,n))
    for i in range(n):
        for j in range(m):
            dataT[j][i] = data[i][j]
    return dataT

#行向量轉化為列向量
def reshapelist(list):
    #print(list)
    rl = np.zeros((len(list),1))
    for i in range(len(list)):
        rl[i][0] = list[i]
    return rl

相關文章