課題1
畢業(yè)設(shè)計里面涉及到人員相關(guān)度的計算辆琅,在這里我提出了一個猜想笙什,大致如下:
現(xiàn)有數(shù)據(jù):學(xué)生id即供、學(xué)生手機mac地址、時間戳扫茅、地點id
構(gòu)想:通過學(xué)生mac地址某地點出現(xiàn)頻次蹋嵌,構(gòu)建頻次矩陣,比如說現(xiàn)有六個地點葫隙,ABCDEF栽烂,某學(xué)生出現(xiàn)的頻次分別為1、5、2腺办、4焰手、7、3怀喉,則[1,5,2,4,7,3]即為該學(xué)生在矩陣中的表現(xiàn)形式册倒。(總的來說就是講每個學(xué)生的出現(xiàn)頻次規(guī)律抽象成一個向量,該向量由n個Term組成磺送,每個Term都有一個權(quán)重,不同的頻次根據(jù)學(xué)生在總矩陣中影響相關(guān)度的權(quán)重)
實現(xiàn)步驟:
1.數(shù)據(jù)預(yù)處理灿意,建立空間向量模型估灿,表現(xiàn)形式為:[[3,4,1,5,6,7],[6,4,5,5,2,1],......];
2.特征抽取完之后缤剧,對矩陣進行正則化處理馅袁。
3.計算余弦相似度。
分子:兩個向量的點乘積
分母:兩個向量的模的乘積
知識點:
1.利用python進行矩陣的正則化
正則化的過程是將每個樣本縮放到單位范數(shù)(每個樣本的范數(shù)為1)荒辕,如果后面要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用汗销。
Normalization主要思想是對每個樣本計算其p-范數(shù),然后對該樣本中每個元素除以該范數(shù)抵窒,這樣處理的結(jié)果是使得每個處理后樣本的p-范數(shù)(l1-norm,l2-norm)等于1弛针。
p-范數(shù)的計算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p
該方法主要應(yīng)用于文本分類和聚類中。例如李皇,對于兩個TF-IDF向量的l2-norm進行點積削茁,就可以得到這兩個向量的余弦相似性。
sklearn數(shù)據(jù)預(yù)處理函數(shù):
from sklearn import preprocessing
2.python字典排序
知識點參照:python字典排序
python代碼
# -*- coding: UTF-8 -*-
__author__ = 'Suzibo'
import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn import feature_extraction
#from sklearn.feature_extraction.text import TfidfTransformer
#from sklearn.feature_extraction.text import CountVectorizer
arr = np.array([[3,5,3,0,5,5],
[3,4,3,3,5,1],
[5,7,8,12,1,0],
[5,1,3,1,1,2],
[0,7,3,1,5,1],
[7,1,2,3,6,1],
[0,9,2,1,4,1],
[3,0,3,1,0,5]])
#模擬了ABCDEF六個感知點掉房,對應(yīng)的八個人的頻次矩陣茧跋。TAT,因為遲遲拿不到數(shù)據(jù)卓囚,只能靠自己模擬數(shù)據(jù)玩玩了瘾杭,慘_(:з」∠)_
arr_normalized = preprocessing.normalize(arr)
#將原始矩陣正則化
result = np.zeros(((len(arr)-1),2))
n=0
#初始化結(jié)果矩陣(N行2列的0矩陣)
a=dict()
#初始化字典
for i in range(1,len(arr)):
#比較第一名同學(xué)跟其他同學(xué)的余弦相似度
num = np.sum(arr_normalized[0]*arr_normalized[i])
#向量乘積
denom = np.linalg.norm(arr_normalized[0]) * np.linalg.norm(arr_normalized[i])
#向量模的乘積
cos = num/denom
sim = 0.5 + 0.5*cos
#結(jié)果歸一化
result[n][0]=i
result[n][1]=sim
n=n+1
#結(jié)果存入數(shù)組
a[i] = sim
#結(jié)果存入字典
print result
print sorted(a.iteritems(),key=lambda asd:asd[1],reverse=True)
#在這里,用了字典對象a以及初始化了數(shù)組result分別存儲計算結(jié)果哪亿。其實兩種方法皆可粥烁,但是字典排序?qū)懫饋砀涌焖佟?
result:
[[ 1. 0.92443667]
[ 2. 0.7434795 ]
[ 3. 0.85627822]
[ 4. 0.91615085]
[ 5. 0.84737882]
[ 6. 0.88826077]
[ 7. 0.83610165]]
sorted(a.iteritems(),key=lambda asd:asd[1],reverse=True):
[(1, 0.9244366688881116), (4, 0.91615085086634984), (6, 0.88826076864678882), (3, 0.85627822353819516), (5, 0.84737881773469248), (7, 0.83610165222088828), (2, 0.74347950132065999)]