rbg-vectors.pyLearning about vectors through RGB
import%20marimo%0A%0A__generated_with%20%3D%20%220.13.15%22%0Aapp%20%3D%20marimo.App(%0A%20%20%20%20width%3D%22medium%22%2C%0A%20%20%20%20app_title%3D%22Learning%20about%20vectors%20through%20RGB%22%2C%0A)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20plotly.express%20as%20px%0A%20%20%20%20import%20plotly.graph_objs%20as%20go%0A%20%20%20%20import%20torch%0A%20%20%20%20import%20torch.nn.functional%20as%20F%0A%20%20%20%20from%20PIL%20import%20Image%0A%20%20%20%20return%20F%2C%20Image%2C%20go%2C%20mo%2C%20np%2C%20px%2C%20torch%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%23%20Learning%20about%20vectors%20through%20RGB%0A%0A%20%20%20%20RGB%20is%20a%20color%20scheme%20to%20encode%20colors%20through%20red%2C%20green%20and%20blue%20primary%20colors.%20%60255%2C%20255%2C%20255%60%20is%20complete%20white%2C%20%600%2C%200%2C%200%60%20is%20a%20complete%20black.%20Every%20other%20color%20is%20a%20combination%20of%20red%2C%20blue%20and%20green%20from%20%240%204to%20%24255%24.%20That's%20%24256%5E3%24%20possible%20colors%20when%20using%20the%208%20bits%20per%20color.%20Let's%20create%20a%203d%20scatter%20plot%20using%20plotly%20to%20visualize%20%241000%24%20random%20colors.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(go%2C%20np)%3A%0A%20%20%20%20points%20%3D%20set()%0A%0A%20%20%20%20%23%20generate%20a%20subset%20of%20256%5E3%20colors%20for%20optimization%0A%20%20%20%20for%20_%20in%20range(1000)%3A%0A%20%20%20%20%20%20%20%20ri%20%3D%20np.random.randint(0%2C%20256)%0A%20%20%20%20%20%20%20%20gi%20%3D%20np.random.randint(0%2C%20256)%0A%20%20%20%20%20%20%20%20bi%20%3D%20np.random.randint(0%2C%20256)%0A%20%20%20%20%20%20%20%20points.add((ri%2C%20gi%2C%20bi))%0A%0A%20%20%20%20x%2C%20y%2C%20z%20%3D%20zip(*points)%0A%20%20%20%20colors%20%3D%20%5B'rgb(%7B%7D%2C%7B%7D%2C%7B%7D)'.format(ri%2C%20gi%2C%20bi)%20for%20ri%2C%20gi%2C%20bi%20in%20points%5D%0A%0A%20%20%20%20trace%20%3D%20go.Scatter3d(%0A%20%20%20%20%20%20%20%20x%3Dx%2C%0A%20%20%20%20%20%20%20%20y%3Dy%2C%0A%20%20%20%20%20%20%20%20z%3Dz%2C%0A%20%20%20%20%20%20%20%20mode%3D'markers'%2C%0A%20%20%20%20%20%20%20%20marker%3Ddict(size%3D3%2C%20color%3Dlist(colors)%2C%20opacity%3D0.8)%0A%20%20%20%20)%0A%20%20%20%20go.Figure(data%3D%5Btrace%5D)%0A%20%20%20%20return%20(points%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20As%20a%20human%20I%20can%20visually%20tell%20%60(250%2C%208%2C%20228)%60%20is%20closer%20to%20%60(221%2C%202%2C%20255)%60%20than%20%60(0%2C%20246%2C%205)%60%2C%20but%20how%20can%20I%20programatically%20determine%20that.%20Turns%20out%20there%20are%20numerous%20ways%20to%20measure%20similarity%20of%20two%20vectors%2C%20some%20common%20ones%20include%3A%0A%0A%20%20%20%20*%20Manhanttan%20distance%20(also%20known%20as%20%24l_1%24%20norm).%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%7C%7C%5Cboldsymbol%7Bv%7D%7C%7C_%7B1%7D%20%3D%0A%20%20%20%20%5Clarge%5Cleft(%20%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20v_%7Bi%7D%5E1%20%5Cright)%5E%5Cfrac%7B1%7D%7B1%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20*%20Euclidean%20distance%20(also%20known%20as%20%24l_2%24%20norm).%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%7C%7C%5Cboldsymbol%7Bv%7D%7C%7C_%7B2%7D%20%3D%0A%20%20%20%20%5Clarge%5Cleft(%20%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20v_%7Bi%7D%5E2%20%5Cright)%5E%5Cfrac%7B1%7D%7B2%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20If%20you%20squint%20closely%20you%20can%20see%20these%20are%20special%20cases%20of%20norm%20defined%20by%20%24l_p%24%20norm.%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%7C%7C%5Cboldsymbol%7Bv%7C%7C%7D_%7Bp%7D%20%3D%0A%20%20%20%20%5Clarge%5Cleft(%20%5Csum_%7Bi%3D1%7D%5E%7BN%7D%20%7Cv_%7Bi%7D%7C%5Ep%20%5Cright%20)%20%5E%5Cfrac%7B1%7D%7Bp%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20*%20Cosine%20similarity%20(dot%20product%20of%20vectors%20divided%20by%20product%20of%20their%20%24l_2%24%20norms).%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%3D%20%5Cfrac%7B%5Cboldsymbol%7Bv%7D%20%5Ccdot%20%5Cboldsymbol%7Bw%7D%7D%7B%7C%7C%5Cboldsymbol%7Bv%7D%7C%7C%20%5Ccdot%20%7C%7C%5Cboldsymbol%7Bw%7D%7C%7C%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20All%20three%20are%20scalar%20measure.%20Cosine%20similarity%20is%20between%20%60(-1%2C%201)%60%2C%20-1%20being%20further%20away%20and%201%20being%20closest.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20p1%2C%20p2)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20rf%22%22%22%0A%20%20%20%20---%0A%20%20%20%20Let's%20compare%20the%20distance%20between%20%60%7Bp1%7D%60%20and%20%60%7Bp2%7D%60%2C%20colors%20at%20almost%20two%20opposite%20end%20of%20spectrum%20(we%20can't%20use%20white%20since%20this%20page%20background%20is%20whitea%20nd%20you%20won't%20see%20anything)%20using%20various%20similarity%20measures.%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20p1%20%3D%20np.array((1%2C1%2C1))%0A%20%20%20%20p2%20%3D%20np.array((255%2C230%2C230))%0A%20%20%20%20return%20p1%2C%20p2%0A%0A%0A%40app.cell%0Adef%20_(Image%2C%20mo%2C%20p1%2C%20p2)%3A%0A%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20Image.new('RGB'%2C%20(100%2C%20100)%2C%20tuple(p1))%2C%0A%20%20%20%20%20%20%20%20Image.new('RGB'%2C%20(100%2C%20100)%2C%20tuple(p2))%0A%20%20%20%20%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20def%20euclidean_distance(p1%2C%20p2)%3A%0A%20%20%20%20%20%20%20%20return%20np.sqrt((p1%5B0%5D%20-%20p2%5B0%5D)**2%20%2B%20(p1%5B1%5D%20-%20p2%5B1%5D)**2%20%2B%20(p1%5B2%5D%20-%20p2%5B2%5D)**2)%0A%0A%20%20%20%20def%20manhattan_distance(p1%2C%20p2)%3A%0A%20%20%20%20%20%20%20%20return%20np.abs(np.linalg.norm(p1%2C%20ord%3D1)%20-%20np.linalg.norm(p2%2C%20ord%3D1))%0A%0A%20%20%20%20def%20cosine_sim(p1%2C%20p2)%3A%0A%20%20%20%20%20%20%20%20return%20np.dot(p1%2C%20p2)%20%2F%20(np.linalg.norm(p1)%20*%20np.linalg.norm(p2))%0A%20%20%20%20return%20cosine_sim%2C%20euclidean_distance%2C%20manhattan_distance%0A%0A%0A%40app.cell%0Adef%20_(manhattan_distance%2C%20mo%2C%20p1%2C%20p2)%3A%0A%20%20%20%20manhattan_distance(p1%2C%20p2)%0A%20%20%20%20mo.md(f%22Manhattan%20Distance%3A%20%7Bmanhattan_distance(p1%2Cp2).round(2)%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(euclidean_distance%2C%20mo%2C%20p1%2C%20p2)%3A%0A%20%20%20%20mo.md(f%22%22%22Euclidean%20distance%3A%20%7Beuclidean_distance(p1%2Cp2).round(2)%7D%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(euclidean_distance%2C%20mo%2C%20p1%2C%20p2)%3A%0A%20%20%20%20mo.md(f%22%22%22Euclidean%20distance%20(using%20numpy)%3A%20%7Beuclidean_distance(p1%2Cp2).round(2)%7D%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cosine_sim%2C%20mo%2C%20p1%2C%20p2)%3A%0A%20%20%20%20mo.md(f%22%22%22Cosine%20similarity%3A%20%7Bcosine_sim(p1%2Cp2).round(4)%7D%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cosine_sim%2C%20mo%2C%20p1%2C%20p2)%3A%0A%20%20%20%20mo.md(rf%22%22%22Something%20curious%20happens%20when%20do%20cosine%20similarity%20of%20%60%7Bp1%7D%60%20and%20%60%7Bp2%7D%60%3A%20%60%7Bcosine_sim(p1%2Cp2).round(4)%7D%60%2C%20it%20is%20suprisingly%20close.%20This%20is%20because%20cosine%20similarity%20is%20not%20a%20distance%20metric%2C%20but%20measure%20of%20angle%20between%20the%20two%20vectors.%20RGB%20unlike%20the%20embedding%20vectors%20you%20get%20from%20a%20encoder%20only%20model%20ranges%20from%200%20to%20255%20and%20not%20trained%20with%20a%20cost%20function%20that%20lets%20us%20use%20cosine%20similarity.%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20p1)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20rf%22%22%22%0A%20%20%20%20---%0A%0A%20%20%20%20Below%20are%20some%20histograms%20showing%20how%20various%20similarity%20measures%20measure%20with%20%60%7Bp1%7D%60%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(euclidean_distance%2C%20p1%2C%20points%2C%20px)%3A%0A%20%20%20%20px.imshow(%0A%20%20%20%20%20%20%20%20%5B%5Beuclidean_distance(p1%2C%20p)%5D%20for%20p%20in%20points%5D%2C%20%0A%20%20%20%20%20%20%20%20aspect%3D%22auto%22%2C%0A%20%20%20%20%20%20%20%20title%3D%22Euclidean%20Distance%20comparision%20of%20(1%2C1%2C1)%20to%20other%20points%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(F%2C%20np%2C%20p1%2C%20points%2C%20px%2C%20torch)%3A%0A%20%20%20%20px.imshow(%0A%20%20%20%20%20%20%20%20%5B%5BF.cosine_similarity(torch.from_numpy(np.array(p1)).float()%2C%20torch.from_numpy(np.array(p)).float()%2C%20dim%3D0)%5D%20for%20p%20in%20points%5D%2C%20%0A%20%20%20%20%20%20%20%20aspect%3D%22auto%22%2C%0A%20%20%20%20%20%20%20%20title%3D%22Cosine%20similarity%20comparision%20of%20(1%2C1%2C1)%20to%20other%20points%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(manhattan_distance%2C%20p1%2C%20points%2C%20px)%3A%0A%20%20%20%20px.imshow(%0A%20%20%20%20%20%20%20%20%5B%5Bmanhattan_distance(p1%2C%20p)%5D%20for%20p%20in%20points%5D%2C%0A%20%20%20%20%20%20%20%20aspect%3D%22auto%22%2C%20%0A%20%20%20%20%20%20%20%20title%3D%22Manhattan%20Distance%20comparision%20of%20(1%2C1%2C1)%20to%20other%20points%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
419f0f72a7b707814ee85f207dce7d443737b368e51711eeae24ce6f6dffab4b