目錄
- 1. 聚類與分類
- 1.1 聚類
- 1.2 分類
- 2. 關于KNN演算法
- 2.1 `Lp距離`定義:
- 2.1 `K `值的選取
- 3. 練習
- 第一題:
- 第二題:
- 最后
1. 聚類與分類
1.1 聚類
聚類是將資料物件的集合分成相似的物件類的程序,使得同一個簇(或類)中的物件之間具有較高的相似性,而不同簇中的物件具有較高的相異性,并且事先不知道資料集本身有多少類別,屬于無監督學習,
e.g:
比如預測某一學校的在校大學生的好朋友團體,我們不知道大學生和誰關系好或和誰關系不好,我們通過他們的相似度進行聚類,聚成n個團體,這就是聚類,
1.2 分類
分類就是事先已知道資料集中包含多少種類,從而對資料集中每一樣本進行分類,且所分配的標簽必須包含在已知的標簽集中,屬于監督學習,
e.g:
比如對一個學校的在校大學生進行性別分類,我們會下意識很清楚知道分為“男”,“女”,對于一個分類器,通常需要你告訴它“這個東西被分為某某類”,
2. 關于KNN演算法
鄰近演算法,或者說K最近鄰分類演算法是資料挖掘分類技術中最簡單的方法之一,所謂K最近鄰,就是K個最近的鄰居的意思,說的是每個樣本都可以用它最接近的K個鄰居來代表,KNN是通過測量不同特征值之間的距離進行分類,(后續有例題)
2.1 Lp距離定義:

-
當p=1時,就是曼哈頓距離(對應L1范數)
-
當p=2時,就是歐氏距離(對應L2范數)
2.1 K值的選取
-
如果選擇較小的
K值,就相當于用較小的鄰域中的訓練實體進行預測,學習的近似誤差會減小,只有與輸入實體較近的訓練實體才會對預測結果起作用,但缺點是學習的估計誤差會增大,預測結果會對近鄰的實體點分成敏感,如果鄰近的實體點恰巧是噪聲,預測就會出錯,換句話說,K值減小就意味著整體模型變復雜,分的不清楚,就容易發生過擬合, -
如果選擇較大
K值,就相當于用較大鄰域中的訓練實體進行預測,其優點是可以減少學習的估計誤差,但近似誤差會增大,也就是對輸入實體預測不準確,K值得增大就意味著整體模型變的簡單,
3. 練習
使用Sklearn中的make_circles方法生成訓練樣本,隨機生成測驗樣本,用KNN分類并可視化,
第一題:
"""
Sklearn中的make_circles方法生成訓練樣本
并隨機生成測驗樣本,用KNN分類并可視化,
"""
from sklearn.datasets import make_circles
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
import numpy as np
import random
fig = plt.figure(1, figsize=(10, 5))
x1, y1 = make_circles(n_samples=400, factor=0.4, noise=0.1)
# 模型訓練 求距離、取最小K個、求類別頻率
knn = KNeighborsClassifier(n_neighbors=15)
knn.fit(x1, y1) # X是訓練集(橫縱坐標) y是標簽類別
# SVM 支持向量機(Support Vector Machine)
"""
置信風險與兩個量有關,一是樣本數量,顯然給定的樣本數量越大,我們的學習結果越有可能正確,
此時置信風險越小;二是分類函式的VC維,顯然VC維越大,推廣能力越差,置信風隙訓變大,
公式中R(w)就是真實風險,Remp(w)就是經驗風險,Ф(n/h)就是置信風險,
統計學習的目標從經驗風險最小化變為了尋求經驗風險與置信風險的和最小,即結構風險最小,
SVM正是這樣一種努力最小化結構風險的演算法.
SVM就是試圖把棍放在最佳位置,好讓在棍的兩邊有盡可能大的間隙,
# 進行預測
x2 = random.random() # 測驗樣本橫坐標
y2 = random.random() # 測驗樣本縱坐標
X_sample = np.array([[x2, y2]]) # 給測驗點
# y_sample = knn.predict(X_sample) # 呼叫knn進行predict得預測類別
y_sample = []
for i in range(0, 400):
dx = x1[:, 0][i] - x2
dy = x1[:, 1][i] - y2
d = (dx ** 2 + dy ** 2) ** 1 / 2
y_sample.append(d)
neighbors = knn.kneighbors(X_sample, return_distance=False)
plt.subplot(121)
plt.title('data by make_circles() 1')
plt.scatter(x1[:, 0], x1[:, 1], marker='o', s=100, c=y1)
# 這個s就是點的大小 marker是標記的意思,就是說用什么標記,比如這里用o來標記,可以嘗試換成其他可行的marker試試,
# 這個x1[:,0] 就是選取x1的全部元素里面的第0列
# 這個x1[:,1] 就是選取x1的全部元素里面的第1列
# c就是顏色的意思,就是按照y1的分類進行填充顏色
plt.scatter(x2, y2, marker='*', c='b')
plt.subplot(122)
plt.title('data by make_circles() 2')
plt.scatter(x1[:, 0], x1[:, 1], marker='o', s=100, c=y1)
plt.scatter(x2, y2, marker='*', c='r', s=100)
for i in neighbors[0]:
plt.scatter([x1[i][0], X_sample[0][0]], [x1[i][1], X_sample[0][1]], marker='o', c='b', s=100)
plt.show()
效果圖:

第二題:
Sklearn中的datasets方法匯入訓練樣本,并用留一法產生測驗樣本,用KNN分類并輸出分類精度,
"""
Sklearn中的datasets方法匯入訓練樣本
并用留一法產生測驗樣本
用KNN分類并輸出分類精度
"""
import warnings
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import LeaveOneOut
import matplotlib.pyplot as plt
warnings.filterwarnings('ignore') # 忽略warning
iris = datasets.load_iris()
X = iris.data
y = iris.target
loo = LeaveOneOut() # 留一法,將資料集劃分為訓練集和測驗集
K = []
Accuracy = []
for k in range(1, 16): # 將k從1到16結束,
correct = 0
knn = KNeighborsClassifier(k)
for train, test in loo.split(X): # 對測驗機和訓練集進行分割
knn.fit(X[train], y[train]) # 初始化svm進行訓練,
y_sample = knn.predict(X[test])
if y_sample == y[test]: # 如果是正確的就累積+1
correct += 1
K.append(k)
Accuracy.append(correct / len(X))
plt.plot(K, Accuracy)
plt.xlabel('Accuracy:')
plt.ylabel('K:')
print('K次數:{} Accuracy正確率:{}'.format(k, correct / len(X)))
plt.show()
輸出結果:

影像結果:

最后
小生凡一,期待你的關注
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297072.html
標籤:AI
上一篇:YOLOV4垃圾檢測召回率提升
