① R語言-KNN演算法
1、K最近鄰(k-NearestNeighbor,KNN)分類演算法,是一孝含個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。
2、KNN演算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於KNN方法主要靠周圍有限的鄰近的樣本,而不簡大是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
3、KNN演算法不僅可以用於分類,還可以用於回歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成正比。
簡言之,就是將未標記的案例歸類為與它們最近相似的、帶有標記的案例所在的類 。
原理及舉例
工作原理:我們知道樣本集中每一個數據與所屬分類的對應關系,輸入沒有標簽的新數據後,將新數據與訓練集的數據對應特徵進行比較,找出「距離」最近的k(通常k<20)數據,選擇這k個數據中出現最多的分類作為新數據的分類。
演算法描述
1、計算已知數據集中的點與當前點的距離
2、按距離遞增次序排序
3、選取與當前數據點距離最近的K個點
4、確定前K個點所在類別出現的頻率
5、返回頻率最高的類別作為當前類別的預測巧咐笑
距離計算方法有"euclidean"(歐氏距離),」minkowski」(明科夫斯基距離), "maximum"(切比雪夫距離), "manhattan"(絕對值距離),"canberra"(蘭式距離), 或 "minkowski"(馬氏距離)等
Usage
knn(train, test, cl, k = 1, l = 0, prob =FALSE, use.all = TRUE)
Arguments
train
matrix or data frame of training set cases.
test
matrix or data frame of test set cases. A vector will be interpreted as a row vector for a single case.
cl
factor of true classifications of training set
k
number of neighbours considered.
l
minimum vote for definite decision, otherwisedoubt. (More precisely, less thank-ldissenting votes are allowed, even
ifkis increased by ties.)
prob
If this is true, the proportion of the votes for the
winning class are returned as attributeprob.
use.all
controls handling of ties. If true, all distances equal
to thekth largest are
included. If false, a random selection of distances equal to thekth is chosen to use exactlykneighbours.
kknn(formula = formula(train), train, test, na.action = na.omit(), k = 7, distance = 2, kernel = "optimal", ykernel = NULL, scale=TRUE, contrasts = c('unordered' = "contr.mmy", ordered = "contr.ordinal"))
參數:
formula A formula object.
train Matrix or data frame of training set cases.
test Matrix or data frame of test set cases.
na.action A function which indicates what should happen when the data contain 』NA』s.
k Number of neighbors considered.
distance Parameter of Minkowski distance.
kernel Kernel to use. Possible choices are "rectangular" (which is standard unweighted knn), "triangular", "epanechnikov" (or beta(2,2)), "biweight" (or beta(3,3)), "triweight" (or beta(4,4)), "cos", "inv", "gaussian", "rank" and "optimal".
ykernel Window width of an y-kernel, especially for prediction of ordinal classes.
scale Logical, scale variable to have equal sd.
contrasts A vector containing the 』unordered』 and 』ordered』 contrasts to use
kknn的返回值如下:
fitted.values Vector of predictions.
CL Matrix of classes of the k nearest neighbors.
W Matrix of weights of the k nearest neighbors.
D Matrix of distances of the k nearest neighbors.
C Matrix of indices of the k nearest neighbors.
prob Matrix of predicted class probabilities.
response Type of response variable, one of continuous, nominal or ordinal.
distance Parameter of Minkowski distance.
call The matched call.
terms The 』terms』 object used.
iris%>%ggvis(~Length,~Sepal.Width,fill=~Species)
library(kknn)
data(iris)
dim(iris)
m<-(dim(iris))[1]
val<-sample(1:m,size=round(m/3),replace=FALSE,prob=rep(1/m,m))
建立訓練數據集
data.train<-iris[-val,]
建立測試數據集
data.test<-iris[val,]
調用kknn 之前首先定義公式
formula : Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
iris.kknn<-kknn(Species~.,iris.train,iris.test,distance=1,kernel="triangular")
summary(iris.kknn)
# 獲取fitted.values
fit <- fitted(iris.kknn)
# 建立表格檢驗判類准確性
table(iris.valid$Species, fit)
# 繪畫散點圖,k-nearest neighbor用紅色高亮顯示
pcol <- as.character(as.numeric(iris.valid$Species))
pairs(iris.valid[1:4], pch = pcol, col = c("green3", "red")[(iris.valid$Species != fit)+1]
二、R語言knn演算法
install.packages("class")
library(class)
對於新的測試樣例基於距離相似度的法則,確定其K個最近的鄰居,在K個鄰居中少數服從多數
確定新測試樣例的類別
1、獲得數據
2、理解數據
對數據進行探索性分析,散點圖
如上例
3、確定問題類型,分類數據分析
4、機器學習演算法knn
5、數據處理,歸一化數據處理
normalize <- function(x){
num <- x - min(x)
denom <- max(x) - min(x)
return(num/denom)
}
iris_norm <-as.data.frame(lapply(iris[,1:4], normalize))
summary(iris_norm)
6、訓練集與測試集選取
一般按照3:1的比例選取
方法一、set.seed(1234)
ind <- sample(2,nrow(iris), replace=TRUE, prob=c(0.67, 0.33))
iris_train <-iris[ind==1, 1:4]
iris_test <-iris[ind==2, 1:4]
train_label <-iris[ind==1, 5]
test_label <-iris[ind==2, 5]
方法二、
ind<-sample(1:150,50)
iris_train<-iris[-ind,]
iris_test<-iris[ind,1:4]
iris_train<-iris[-ind,1:4]
train_label<-iris[-ind,5]
test_label<-iris[ind,5]
7、構建KNN模型
iris_pred<-knn(train=iris_train,test=iris_test,cl=train_label,k=3)
8、模型評價
交叉列聯表法
table(test_label,iris_pred)
實例二
數據集
http://archive.ics.uci.e/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data
導入數據
dir <-'http://archive.ics.uci.e/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data'wdbc.data <-read.csv(dir,header = F)
names(wdbc.data) <- c('ID','Diagnosis','radius_mean','texture_mean','perimeter_mean','area_mean','smoothness_mean','compactness_mean','concavity_mean','concave points_mean','symmetry_mean','fractal dimension_mean','radius_sd','texture_sd','perimeter_sd','area_sd','smoothness_sd','compactness_sd','concavity_sd','concave points_sd','symmetry_sd','fractal dimension_sd','radius_max_mean','texture_max_mean','perimeter_max_mean','area_max_mean','smoothness_max_mean','compactness_max_mean','concavity_max_mean','concave points_max_mean','symmetry_max_mean','fractal dimension_max_mean')
table(wdbc.data$Diagnosis)## M = malignant, B = benign
wdbc.data$Diagnosis <- factor(wdbc.data$Diagnosis,levels =c('B','M'),labels = c(B ='benign',M ='malignant'))
② 哪本書有講到knn演算法matlab
knnsearch(x,y,'k',5); 就表示在x中找y的最近的5個。返塵哪歲回結果 idx 是m行5列的矩陣,每一行派睜是結果中緩世最近的5個
③ 求k近鄰法實例,有的給我發一個,matlab程序。求高手啊!
大奎!哥來要分!
發個演算法吧,以免口舌,VS2008C#演算法代碼,剛學C#,代碼有些粗糙,絕對好使,想要全部代碼與本人聯系。呵呵~: )
public void knnsf(float PH,float JD,float NH4,float COD,float BOD,float SS,float XTD)
{
double[,] kn = new double[81, 2];
int a = 0, b = 0, c = 0;
//計算歐氏距離
for (int i = 0; i < 27; i++ )
{
kn[i, 0] = Math.Sqrt( Math.Pow(class1[i, 1] - PH, 2) + Math.Pow(class1[i, 2] - JD, 2) + Math.Pow(class1[i, 3] - NH4, 2) +
Math.Pow(class1[i, 4] - COD, 2) + Math.Pow(class1[i, 5] - BOD, 2) + Math.Pow(class1[i, 6] - SS, 2) +
Math.Pow(class1[i, 7] - XTD, 2));
kn[i, 1] = 1;
kn[i+27,0] = Math.Sqrt(Math.Pow(class2[i, 1] - PH, 2) + Math.Pow(class2[i, 2] - JD, 2) + Math.Pow(class2[i, 3] - NH4, 2) +
Math.Pow(class2[i, 4] - COD, 2) + Math.Pow(class2[i, 5] - BOD, 2) + Math.Pow(class2[i, 6] - SS, 2) +
Math.Pow(class2[i, 7] - XTD, 2));
kn[i+27, 1] = 2;
kn[i+54,0] = Math.Sqrt(Math.Pow(class3[i, 1] - PH, 2) + Math.Pow(class3[i, 2] - JD, 2) + Math.Pow(class3[i, 3] - NH4, 2) +
Math.Pow(class3[i, 4] - COD, 2) + Math.Pow(class3[i, 5] - BOD, 2) + Math.Pow(class3[i, 6] - SS, 2) +
Math.Pow(class3[i, 7] - XTD, 2));
kn[i+54, 1] = 3;
}
//選擇排序法
for (int i = 0; i < 81; i++ )
{
int k = 0;
double mintmp = kn[i, 0],clas=kn[i,1];
for (int j = i+1; j < 81; j++)
{
if (mintmp > kn[j, 0])
{
mintmp = kn[j, 0];
clas = kn[j, 1];
k = j;
}
}
kn[k, 0] = kn[i, 0];
kn[k, 1] = kn[i, 1];
kn[i, 0] = mintmp;
kn[i, 1] = clas;
}
//選擇K=30個近鄰
for (int k = 0; k < 3; k++)
{
if (kn[k, 1] == 1) a++;
if (kn[k, 1] == 2) b++;
if (kn[k, 1] == 3) c++;
}
//統計近鄰類別
if (a > b && a > c)
{
classes = 1;
}
if (b > a && b > c)
{
classes = 2;
}
if (c > b && c > a)
{
classes = 3;
}
}
④ KNN-分類演算法
KNN,K-NearestNeighbor,即K個最近的鄰居的意思。對於一個輸入樣本,用特徵上最接近它的K個臨近值大多數屬於的標簽來對它進行分類。KNN是最簡單的機器學習演算法之一,可以用於分類和回歸,是一種監督學習演算法。
具體實現過程如下:
①准備數據,對數據進行預處理
在已經分好類的情況下,我們需要對沒有分類的物品進行分類 。
②計算測試樣本點(也就是待分類點)到其他每個樣本點的距離。
其實就是計算(x1,y1)和(x2,y2)的距離。拓展到多維空間,則公式變成這晌岩樣:
k值是KNN演算法的一個參數,K的含義即參考」鄰居「標簽值的個數。
如含陪果當K的取值過小時,一旦有雜訊得成分存在們將會對預測產生比較大影響,例如取K值為1時,一旦最近的一個點是雜訊,那麼就會出現偏差,K值的減小就意味著整體模型變得復雜,容易發生過擬合;
如果K的值取的過大時,就相當於用較大鄰域中的訓練實例進行預測,學習的近似誤差會增大。這時與輸入目標點較遠實例也會對預測起作用,使預測發生錯誤。K值的增大就意味著整體的模型變得簡單;
如果K==N的時候,那麼就是取全部的實例,即為取實例中某分類下最多的點,就對預測沒有什麼實際的意義了
在劃分好數據集後,我們可以通過交叉驗證法來得到宴老御最佳的K值
優點:
1.無數據輸入假定,在分類完的情況下進行測試
2.預測精度高
3.對異常值不敏感
缺點:
1.時間復雜度和空間復雜度高,計算到每一個點的距離,計算量較大
2.當樣本不平衡的時候,比如一個類的樣本容量大,另一個類的樣本容量很小,對於測試識別的樣本來說,投票結果更容易靠近樣本容量大的類,從而導致分類錯誤
⑤ MATLAB中KNN均值濾波器代碼…… 作業,急!!求教大蝦
道德
⑥ knn最基本的Matlab模擬怎麼弄
准備條件:已經把特徵數據和樣本標號保存為文件。
測試代碼為:
[plain]
view
plain
train_data=load('sample_feature.txt');
train_label=load('train_label.txt');
test_data=load('features.txt');
k=knnclassify(test_data,train_data,train_label,3,'cosine','random');
train_data保存的是訓練樣本特徵,要求是最能代表本類胡閉別的,不一定多,當然不能太少橡做戚;
train_label保存梁陵的是樣本標號,如0,1,2等等,隨便設置,只有能區分就行,具體格式可以為:
[plain]
view
plain
1
1
2
2
3
3
test_data測試文件保存的是測試數據的特徵;
⑦ KNN演算法,k近鄰
K最近鄰(k-Nearest Neighbour,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算回法之一。該方法的思路答是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。
⑧ 文本分類器(基於KNN演算法),語言最好是Matlab的,有測試數據集。。。。
好像這些演算法在數據缺失的情況下是沒法進行的吧,只能說改進之後在數據缺失情況下做了相應處理,你說的這些演算法都可以在網上找到代碼